Как выполнить командную оболочку «для» над файлами с пробелами в именах? - PullRequest
3 голосов
/ 16 февраля 2010

Я часто делаю следующее:

for f in `find -foo -bar -baz`; do
  process "$f"
done

Это, конечно, не работает для имен файлов с пробелами. Как я могу справиться с такими случаями?

Ответы [ 5 ]

4 голосов
/ 16 февраля 2010

Find и xargs хорошо работают вместе. find может печатать имена файлов с ограничителем \0 (опция print0), а xargs может читать их в этом формате (опция -0):

find . -type f -print0 | xargs -0 echo
2 голосов
/ 16 февраля 2010
find . -type f | while read file; do 
     process "$f"
done;
1 голос
/ 16 февраля 2010

Баш 4

shopt -s globstar
for file in /path/**
do
  process "$file"
done
1 голос
/ 16 февраля 2010

Если вы уже используете find, почему бы просто не использовать exec

find -foo -bar -baz -exec process '{}' \;

Альтернативным решением будет изменение переменной IFS (разделитель между полями)

0 голосов
/ 16 февраля 2010

В таких случаях мой подход состоит в том, чтобы создать список перед командой for и заменить пробелы в именах элементов другим символом или строкой, которые вряд ли появятся.

Затем внутри цикла я заменяю эту конкретную строку пробелом.

Пример:

list=`find -foo -bar -baz | tr ' ' 'µ'`
for fx in $list ; do
    f=`echo $fx | tr 'µ' ' '`
    process "$f"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...