bash: обработка (рекурсивно) всех файлов в каталоге - PullRequest
3 голосов
/ 10 декабря 2010

Я хочу написать bash-скрипт, который (рекурсивно) обрабатывает все файлы определенного типа.

Я знаю, что могу получить соответствующий список файлов, используя find таким образом:

найти. -имя "* .ext"

Я хочу использовать это в сценарии:

  1. рекурсивный список файлов с заданным расширением
  2. получить полный путь к файлу
  3. передать полный путь к другому сценарию
  4. Проверьте код возврата из скрипта. Если не ноль, введите имя файла, который не удалось обработать.

Моя первая попытка выглядит (псевдокод) так:

ROOT_DIR = ~/work/projects
cd $ROOT_DIR
for f in `find . -name "*.ext"`
do
    #need to lop off leading './' from filename, but I havent worked out how to use
    #cut yet
    newname = `echo $f | cut -c 3
    filename = "$ROOT_DIR/$newname"

    retcode = ./some_other_script $filename

    if $retcode ne 0
       logError("Failed to process file: $filename")
done

Это моя первая попытка написания bash-скрипта, поэтому приведенный выше фрагмент вряд ли запустится. Надеюсь, что логика того, что я пытаюсь сделать, достаточно ясна, и кто-то может показать, как соединить точки и преобразовать приведенный выше псевдокод в рабочий скрипт.

Я работаю в Ubuntu

Ответы [ 2 ]

12 голосов
/ 10 декабря 2010
find . -name '*.ext' \( -exec ./some_other_script "$PWD"/{} \; -o -print \)
2 голосов
/ 10 декабря 2010

Использование | while read для итерации по именам файлов хорошо, если нет файлов с возвратом носителя для обработки:

find . -name '*.ext' | while IFS=$'\n' read -r FILE; do
  process "$(readlink -f "$FILE")" || echo "error processing: $FILE"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...