Зацикливание имен файлов из `find`? - PullRequest
4 голосов
/ 22 февраля 2012

Если я запускаю эту команду:

sudo find . -name *.mp3

, тогда я могу получить список множества mp3-файлов.

Теперь я хочу что-то сделать с каждым mp3-файлом в цикле.Например, я мог бы создать цикл while и внутри присвоить первое имя файла переменной file.Тогда я мог бы что-то сделать с этим файлом.Затем я мог бы присвоить второе имя файла переменной file и сделать с этим и т. Д.

Как я могу реализовать это с помощью команды оболочки linux?Любая помощь приветствуется, спасибо!

Ответы [ 4 ]

16 голосов
/ 22 февраля 2012

Для этого используйте встроенную функцию read:

sudo find . -name *.mp3 |
while read filename
do
    echo "$filename"    # ... or any other command using $filename
done

При условии, что в именах файлов не используется символ новой строки (\n), это должно работать нормально.

10 голосов
/ 22 февраля 2012

Моими любимыми являются

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
    
  • в целом, каналы просто более универсальны (регистрация, сортировка, удаленное взаимодействие, кэширование, проверка, распараллеливание)и т.д., вы можете сделать это)

1 голос
/ 22 февраля 2012

Как насчет использования опции -exec для поиска?

find . -name '*.mp3' -exec mpg123 '{}' \;

, которая будет вызывать команду mpg123 для каждого найденного файла, т.е. она будет воспроизводить все файлы в порядке их поиска.

0 голосов
/ 22 февраля 2012
for file in $(sudo find . -name *.mp3);
do
    # do something with file
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...