Когда я бегу for i in $(find -name '*.ogg'); do echo '$i'; done
я не получаю одну строку на файл, как я ожидал. Вместо этого, когда в имени файла есть пробел, каждое слово выходит в отдельной строке, поэтому я не могу запускать команды для файлов.
5 ответов
find -name '*.ogg' -print0 | xargs -0 -L1 command
Вот пример того, что вы хотите сделать:
#! /bin/sh
IFS="\n"
for xxx in `cat /etc/hosts`
do
echo $xxx
done
exit 0
IE: измените IFS (Inter Field Seperator) на \n вместо пробела, табуляция, \n
Также нет необходимости в find
в этом случае. Вы можете установить опцию globstar
и использовать bash globbing.
shopt -s globstar
for i in **/*.ogg; do echo '$i'; done
Вы должны find
трубы в петлю в while
вместо:
find -name '*.ogg' | while read -r i; do echo "$i"; done
Кроме того, одинарные кавычки, которые у вас были около $i
позволили бы расширить переменную до ее значения.
Другой способ - использовать процесс подстановки:
while read -r i; do echo "$i"; done < <(find -name '*.ogg')
который имеет то преимущество, не создавая подоболочку из цикла в while
так что набор переменных (и другие изменения в окружающую среду) внутри контура будут доступны после того, как цикл закончен.
Если вы хотите запустить команду параллельно и если у вас установлен GNU Parallel http:// www.gnu.org/software/parallel/, вы можете сделать это:
find -name '*.ogg' | parallel do_stuff {} --options otherargs
Посмотрите вступительное видео для GNU Parallel, чтобы узнать больше:http://www.youtube.com/watch?v=OpaiGYxkSuQ