Dividir "Archivo" y "nombre de directorio con espacio" mediante un script de shell

Dividir "Archivo" y "nombre de directorio con espacio" mediante un script de shell

Tengo un archivo llamado Files.txtque tiene el siguiente contenido:

TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files/AppDelegate.m

Extraigo los nombres de archivos y directorios de la siguiente manera y los paso a otro proceso.

files=$(cat Files.txt)

for item in $files ; do    
  dn=$(dirname $item)

  printf $item
  printf "\n"
  printf $dn
  printf "\n\n"

  # passing to another process
done

Sin embargo, esto me está dando esto:

TestApp/Resources/Supporting
TestApp/Resources

Files/main.m
Files

TestApp/Resources/Supporting
TestApp/Resources

Files/AppDelegate.h
Files

TestApp/Resources/Supporting
TestApp/Resources

Files/AppDelegate.m
Files

Lo que necesito es esto:

TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.m
TestApp/Resources/Supporting Files

Intenté anteponer el espacio con \in Files.txtcomo:

TestApp/Resources/Supporting\ Files/main.m

y con %20como:

TestApp/Resources/Supporting%20Files/main.m

sin suerte!

Respuesta1

  1. forlos bucles se repitenpalabrasno lineas
  2. cite siempre su "$variables"(a menos que sepa exactamente cuándo no hacerlo)
while read -r item ; do    
  dn=$(dirname "$item")

  printf "%s\n" "$item"
  printf "%s\n" "$dn"

  # pass "$item" and "$dn" to another process
done < Files.txt

Respuesta2

Debe configurar el separador de campos:

OIFS=$IFS  
IFS=$'\n'

files=$(cat Files.txt)

for item in $files ; do    
  dn=$(dirname $item)
  printf $item
  printf "\n"
  printf $dn
  printf "\n\n"

  # passing to another process
done

IFS=$OIFS

Producción:

[me@localhost test]$ ./test.sh 
TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.m
TestApp/Resources/Supporting Files

Explicación: http://en.wikipedia.org/wiki/Internal_field_separator

La $IFSvariable define cómo se divide la entrada en tokens y el valor predeterminado es espacio, tabulación y nueva línea. Como desea dividir solo en nuevas líneas, la $IFSvariable debe cambiarse temporalmente.

información relacionada