Моими любимыми являются
find . -name '*.mp3' -exec cmd {} \;
или
find . -name '*.mp3' -print0 | xargs -0 cmd
В то время как цикл
Как отмечали другие, вы часто можете использовать while read
цикл для чтения имен файлов построчно, у него есть недостаток, заключающийся в том, что в именах файлов не допускается конец строки (кто это использует?).
xargs
против -exec cmd {} +
Обобщая комментарии о том, что -exec
... +
лучше, я предпочитаю xargs, потому что он более универсален:
- работает с другими командами, кроме
find
- позволяет «группировать» (группировать) в командной строке, скажем,
xargs -n 10
(по десять одновременно) - позволяет распараллеливать,скажем
xargs -P4
(макс. 4 одновременных процесса, запущенных одновременно) выполняет разделение привилегий (например, в случае OP, где он использует sudo find
: использование -exec
будет запускать все команды какпользователь root, тогда как с xargs
в этом нет необходимости:
sudo find -name '*.mp3' -print0 | sudo xargs -0 require_root.sh
sudo find -name '*.mp3' -print0 | xargs -0 nonroot.sh
в целом, каналы просто более универсальны (регистрация, сортировка, удаленное взаимодействие, кэширование, проверка, распараллеливание)и т.д., вы можете сделать это)