2015-08-20 3 views
0

У меня есть небольшой скрипт, который обрабатывает все файлы в каталоге. Я бы хотел, чтобы это также рекурсивно обрабатывало все файлы во вложенной папке. Любые мысли о том, как это сделать? Мой текущий код:Обработать файлы рекурсивно с помощью bash

#!/bin/bash 
for file in ./input/* 
do 
    do_something "$file" 
done 

ответ

4

Вы можете использовать find:

find input/ -type f -exec do_something {} \; 

С man страницы:

Утилита находкой рекурсивно спускается по дереву каталогов для каждого пути в списке, оценки выражение (состоящее из primaries и operands, перечисленных ниже) в терминах каждого файла в дереве.

Для ясности, вот еще некоторые детали из man страницы о exec и {}:

-exec утилита [аргумент ...];

Истинно, если программа с именем utility возвращает нулевое значение в качестве статуса выхода.

Дополнительные утилиты могут быть переданы утилите. Выражение должно быть завершено точкой с запятой (;). Если вы вызываете find из оболочки , вам может потребоваться указать точку с запятой, если оболочка в противном случае обрабатывала бы как оператор управления. Если строка {} появляется в любом месте в имени утилиты или аргументах, она заменяется именем пути к текущему файлу. Утилита будет выполнена из каталога, из которого была выполнена находка. Утилита и аргументы не подлежат дальнейшему расширению шаблонов и конструкций оболочек.

Надеется, что это помогает :)

+0

'найти вход/-типа е -exec do_something "$ файл"{} \;' бы этот код делать то, что я хотел тогда? – user1769925

+0

Привет. '{}' является заполнителем для сопоставленного пути к файлу, поэтому вам не нужно указывать переменную. –

2

В bash 4, вы можете использовать ** шаблон, который соответствует 0 или более каталогам в пути.

shopt -s globstar 
for file in ./input/**/* 
do 
    do_something "$file" 
done 
+1

приятно знать, приветствия! –

Смежные вопросы