Linux/Unix Shell Scripting - Procesamiento de espacios en variables declaradas por $(comandos)

 
Vista:
Imágen de perfil de Raúl
Val: 15
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Procesamiento de espacios en variables declaradas por $(comandos)

Publicado por Raúl (5 intervenciones) el 22/06/2018 18:03:18
Buen día a todos.

¿Saben si hay forma de que al declarar una variable como output de un comando usando este -> $(), no separe los resultados por espacio y lo haga sólo por '\n'?

Les describo brevemente mi problema, estoy tratando de ordenar un montón de PDFs recuperados por photorec usando scripts, hasta el momento he realizado ordenamiento por metadatos y titulos que no sean de la forma f{número}.{extensión de archivo}, ahora para refinar mi ordenamiento estoy procesando los PDF mediante OCR, usando ocrmypdf y pdftotext, algo como lo que sigue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/bash/
 
# ------------------------------------
# Conseguimos el árbol del directorio,
# sólo sirve para archivos con nombres 
# escritos sin espacios
 
files=$(ls | grep pdf)
declare -i counter
 
# Recorremos el output del comando
 
for file in $files
do
 
  # Separamos el nombre para poder crear archivos "regulares"
  name=$(echo $file | tr "." "\n")
  counter=0
 
  for i in $name
  do
    if  [ $counter -eq 0 ]; then
      baseName=$i
    else
      extension=$i
    fi
      counter=+1
  done
 
  scannedName="scann"$file
  textName=$basename".txt"
 
  # Ahora procesamos OCR
  ocrmypdf $file $scannedName
 
  # Si el PDF ya es OCR entonnces no existe
  # mi archivo, y proceso para TXT al original
 
  if ls $scannedName; then
    pdftotext $scannedName $textName
  else
    pdftotext $file $textName
  fi

La cosa es que
1
$(command)
separa las palabras por espacios, y en caso de archivos que sean del tipo "este es mi archivo.pdf" tengo una variable por palabra en vez de una por archivo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Input:
# archivo1.pdf
# archivo2.pdf
# archivo3.pdf
# mi archivo 4.pdf
 
files=$(ls | grep pdf)
 
#output:
# archivo1.pdf
# archivo2.pdf
# archivo3.pdf
# mi
# archivo 
# 4.pdf

Y no se me ocurre alguna forma de procesar de manera adecuada esos archivos. Espero me puedan dar algunos indicios para resolver mi problema, igual sigo googleando.

Saludos

PD Se que mi redacción para el final es redundante, me disculpo por ello
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip
Val: 66
Plata
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Procesamiento de espacios en variables declaradas por $(comandos)

Publicado por kip (17 intervenciones) el 22/06/2018 18:58:49
Hola, es una mala practica listar los archivos de la forma en la que lo haces, una alternativa podría ser esta:

1
2
3
for file in *pdf*; do
    echo "$file"
done

Lo anterior te servira si ejecutas el archivo sobre el path donde están los archivos pdf.

Quizás eso resuelva el problema que mencionas, inténtalo y si te falla una parte siguiente del código avísanos.

Por cierto te recomiendo usa la interpolación para concatenar cadenas, es mucho mas intuitivo y fácil de leer:

1
textName="${basename}.txt"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Jatib
Val: 15
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Procesamiento de espacios en variables declaradas por $(comandos)

Publicado por Jatib (5 intervenciones) el 22/06/2018 23:29:45
Muchas gracias, funcionó excelente, logró mover todo mi directorio de prueba excepto 1 archivo, porque pese a que le ponga comillas interpreta el "-" como opción de mv, sólo lo omitiré del parssing para que a nada se le ocurra empezar con ese carácter:

1
2
3
mv "-archivo de prueba.pdf" /destino/
mv: opción incorrecta -- «I»
Pruebe 'mv --help' para más información.

Por cierto ¿algún documento (libro, web) que me puedas referir para buenas prácticas de scripting en shell?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Procesamiento de espacios en variables declaradas por $(comandos)

Publicado por Tom (361 intervenciones) el 23/06/2018 09:51:38
La mejor forma para manejar ese fichero que comienza por '-' es añadirle el path:

1
rm "./-archivo de prueba.pdf"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 12
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Procesamiento de espacios en variables declaradas por $(comandos)

Publicado por Santi (5 intervenciones) el 08/10/2018 17:15:05
Saludos,
Modifica la variable separadora de campos al inicio del comando:

oldIFS=$IFS
IFS=$'\n'

------Aquí los comandos que quieras...

IFS=$old_IFS
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar