Когда я бегу for i in $(find -name '*.ogg'); do echo '$i'; done я не получаю одну строку на файл, как я ожидал. Вместо этого, когда в имени файла есть пробел, каждое слово выходит в отдельной строке, поэтому я не могу запускать команды для файлов.

5 ответов5

6
find -name '*.ogg' -print0 | xargs -0 -L1 command
1

Вот пример того, что вы хотите сделать:

 #! /bin/sh
 IFS="\n"
 for xxx in `cat /etc/hosts`
 do
    echo $xxx
 done
 exit 0

IE: измените IFS (Inter Field Seperator) на \n вместо пробела, табуляция, \n

0

Также нет необходимости в find в этом случае. Вы можете установить опцию globstar и использовать bash globbing.

shopt -s globstar
for i in **/*.ogg; do echo '$i'; done
0

Вы должны 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 так что набор переменных (и другие изменения в окружающую среду) внутри контура будут доступны после того, как цикл закончен.

0

Если вы хотите запустить команду параллельно и если у вас установлен 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .