Разделение `File` и` имя каталога с пробелом 'через скрипт оболочки

У меня есть файл с именем Files.txt со следующим содержимым:

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

Я вытаскиваю имена файлов и каталогов как следующие и передавая их другому процессу.

 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 

Тем не менее, это дает мне следующее:

 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 

Мне нужно следующее:

 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 

Я попробовал префикс пространства с \ in Files.txt как:

 TestApp/Resources/Supporting\ Files/main.m 

и %20 :

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

без везения!

  1. for циклов итерации по словам не строк
  2. всегда указывайте свои "$variables" (если вы точно не знаете)
 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 

Вам необходимо установить разделитель полей:

 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 

Вывод:

 [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 

Объяснение: http://en.wikipedia.org/wiki/Internal_field_separator

Переменная $IFS определяет, как ввод разделяется на токены, а по умолчанию – пробел, табуляция и новая строка. Поскольку вы хотите разделить только на новые строки, переменную $IFS необходимо временно изменить.