Назад | Перейти на главную страницу

Как сделать цикл for имен файлов с пробелами с помощью find

У меня есть следующий сценарий - он должен зацикливать имена файлов с помощью 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