Разделение `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 

без везения!

2 Solutions collect form web for “Разделение `File` и` имя каталога с пробелом 'через скрипт оболочки”

  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 необходимо временно изменить.

  • Выйти из bash, когда find попадает в папку с разрешенным разрешением
  • Как передать имя функции тестируемому?
  • Как проверить, отсутствует ли какой-либо повторяющийся текст в текстовом файле?
  • Как предотвратить вытеснение вывода замещения команды bash?
  • Правильное совпадение слов
  • Конкретный способ вывода в файл, если задан аргумент, в stdout в противном случае
  • Получить PID хост-скрипта в bash
  • Диапазон командной строки в unix
  • Есть ли способ конвертировать zip в tar без извлечения его в файловую систему?
  • как проверить, установлены ли оба параметра в bash?
  • Запустить банку при запуске во всех системах на основе * nix
  • Linux и Unix - лучшая ОС в мире.