У меня есть следующий сценарий - он должен зацикливать имена файлов с помощью find, но он швы разбивает имена файлов на пробел? Мне нужно, чтобы имена файлов остались нетронутыми
#!/bin/bash
for file in `find -name "*.avi"`
do
./myscript $file
done
Может кто-нибудь помочь мне?
Спасибо
Также: find -name "*.avi" -exec ./myscript '{}' \;
Ответ Womble определенно работает в большинстве случаев, но Xargs не идеален с пробелами во всех реализациях. Я никогда не находил, чтобы режим «exec» мог сломаться. В этом отношении Solaris был особенно капризен.
Очевидно, что «-print» лучше всего подходит для простой генерации вывода для списка файлов в цикле for. Но если вы запускаете команду для списка файлов, более эффективно просто запустить параметр -exec.
find -name "*.avi" -print0 | xargs -0 -n 1 echo
Вам не нужно echo
в xargs
:
find -name "*.avi" -print0 | xargs -0 -n 1 ./myscript
Если вам не нужна рекурсия:
#!/bin/bash
for file in *.avi
do
./myscript "$file"
done
Обратите внимание, что кавычки вокруг переменной важны.
Редактировать:
Как указывает Кодзиро, если вам нужна рекурсия и у вас есть Bash 4, вы можете добавить shopt -s globstar
и измените глобус на **/*.avi
.
В дополнение к решениям, основанным на xargs и find -exec, существует также возможность подключения по конвейеру во время чтения. Его преимущество состоит в том, что вы можете структурировать сценарий в более классической манере цикла. Позвольте мне применить это к вашему примеру.
find -name "*.avi" | while read avifile; do
./myscript "$avifile"
done