2010-12-10 3 views
3

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

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

находку. -name «* .ext»

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

  1. рекурсивно obatin список файлов с заданным расширением
  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 

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

Я бегу на Ubuntu

+1

Если вы используете «найти $ ROOT_DIR -name "* .exe" вам не нужно будет играть с ведущим «./». – 2010-12-10 15:39:27

ответ

12
find . -name '*.ext' \(-exec ./some_other_script "$PWD"/{} \; -o -print \) 
+0

+1 Хорошее решение, я не знал, что вы можете использовать - так. Единственная проблема заключается в том, что иногда (не здесь) вам нужно вызывать функцию вместо внешнего исполняемого файла. – tokland 2010-12-10 15:52:42

+0

Хмм довольно загадочно это .... (напоминает мне Perl!). Я не понимаю этого. Как передать имя файла другому скрипту, и как узнать, вернул ли этот скрипт ненулевое значение, поэтому я знаю что-то сделать? – skyeagle 2010-12-10 17:42:07

2

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

find . -name '*.ext' | while IFS=$'\n' read -r FILE; do 
    process "$(readlink -f "$FILE")" || echo "error processing: $FILE" 
done