2012-12-02 4 views
1

У меня есть несколько папок, какBash скрипт для поиска файлов в папках

Main/ 
    /a 
    /b 
    /c  
.. 

я должен пройти входной файл abc1.txt, abc2.txt каждой из этих папок соответственно в качестве входного файла в моей питона программе. сценарий прямо сейчас,

for i in `cat file.list` 
do 
echo $i 
cd $i 
#works on the assumption that there is only one .txt file 
inputfile=`ls | grep .txt` 
echo $inputfile 
python2.7 ../getDOC.py $inputfile 
sleep 10 
cd .. 
done 
echo "Script executed successfully" 

Так что я хочу, чтобы скрипт корректно работать независимо от количества .txt.

Может ли кто-нибудь сообщить мне, есть ли встроенная команда в оболочке для извлечения правильных файлов .txt в случае для нескольких TXT-файлов?

+0

Какова связь между файлом 'file.list' и' .txt' файлами? Когда ваша переменная '$ i' используется отдельно от строки' echo $ i'? –

+0

Что уникально в вашем .txt файле, который должен быть передан сценарию pyhton? если его имя файла не может найти. -name file.txt – Chipmunk

+0

file.list имеет все папки в нем. Файл .txt находится во всех папках. И переменная $ i используется для записи cd в эту папку, так или иначе она была опущена в скрипте. – veepsk

ответ

3

Команда find хорошо подходит для этого с -exec:

find /path/to/Main -type f -name "*.txt" -exec python2.7 ../getDOC.py {} \; -exec sleep 10 \; 

Пояснение:

  • find - вызвать find
  • /path/to/Main - каталог, чтобы начать поиск в. По умолчанию find ищет рекурсивно.
  • -type f - рассматривать только файлы (в отличие от каталогов, и т.д.)
  • -name "*.txt" - найти только файлы с расширением .txt. Это цитируется так, что bash не автоматически расшифровывает подстановочный знак * через globbing.
  • -exec ... \; - Для каждого такого результата найдено, выполните следующую команду на нем:
  • python2.7 ../getDOC.py {}; - {} часть, где результат поиска из find получает подставляется в каждый момент времени.
  • sleep 10 - спящий режим в течение 10 секунд после каждого запуска скрипта python в файле. Удалите это, если вы не хотите, чтобы он спал.
+0

Ударьте меня, черт. +1. –

+0

Я сомневаюсь, что вы пробовали свое решение: он терпит неудачу, потому что первая точка с запятой используется bash. Вероятно, вы имеете в виду 'find/path/to/Main -type f -name" * .txt "-exec python2.7 ../getDOC.py {} \; -exec sleep 10 \; ' –

+0

@sudo_O haha, это был самый быстрый +1, на который я ответил: D –

0
find . -name *.txt | xargs python2.7 ../getDOC.py 
+2

'* .txt' не будет расширяться .. нужны кавычки. –

+1

Я бы добавил '-print0' и' -type f', чтобы найти и '-0' вариант для xargs. – Lynch

+2

Я бы просто не использовал этот метод вообще и использовал опцию '-exec' от find, как это делал sampson-chen (почти). –

1

Лучше с помощью globs:

shopt -s globstar nullglob 
for i in Main/**/*txt; do 
    python2.7 ../getDOC.py "$i" 
    sleep 10 
done 

Этот пример является рекурсивным и требуют

+1

Это мой любимый способ сделать (для таких простых шаблонов поиска). Это было бы просто идеально с 'shopt -s nullglob' или' shopt -s failglob'. –

+0

Да, сообщение отредактировано соответственно –

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