2016-05-20 6 views
0

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

Существует общий путь для всех пяти каталогов 1, 2, 3, 4, 5, как:

/dir1/dir2/dir3/1/ 
/dir1/dir2/dir3/2/ 
/dir1/dir2/dir3/3/ 
/dir1/dir2/dir3/4/ 
/dir1/dir2/dir3/5/ 

Короче говоря, 1, 2, 3, 4, 5 в dir3.

В качестве примера,
каталогов 1 и 3 есть файлы с расширением .txt
каталогов 2, 4, 5 имеют файлы с расширением .gz

я делаю это, как сейчас :

while [ $a -le 5 ] 
    do 
     cat /dir1/dir2/dir3/"$a"/*.txt | grep "string" > /path/output"$a" 
     zcat -f /dir1/dir2/dir3/"$a"/*.gz | grep "string" > /path/output"$a" 
     ((a++)) 
    done 

Выводы создаются, но некоторые из них пустые. Я уверен, что входы имеют ту строку, которую я использовал в grep. Я думаю, что сценарий, который я использую, переписывает файлы.

Как выполнить это, сначала выполнив поиск в расширении файла и выполнив либо cat, либо zcat соответственно? Пожалуйста, предложите?

Edit:

Я также попытался следующие:

while [ $a -le 5 ] 
    do 

for f in /dir1/dir2/dir3/"$a"/*.txt 
    do 
     cat $f | grep "string" > /path/output"$a" 
    done 
for f in /dir1/dir2/dir3/"$a"/*.gz 
    do 
     cat $f | grep "string" > /path/output"$a" 
    done 

done 
+0

Вы отредактировали попытку, которая должна работать до тех пор, пока вы используете 'shopt -s nullglob'. Это предотвращает ввод одного или другого цикла 'for'. Если по какой-либо причине вы получаете файлы 'gz' и' txt' в том же каталоге, результат цикла 'gz' будет перезаписывать результат цикла' txt'. – chepner

+0

@chepner Да. Это прекрасно, если я перенаправляю вывод в разные каталоги - один для .txt и один для .gz. – intruder

ответ

1

Соберите все файлы .txt в в одном массиве, и если этот массив не пуст, запустите cat. В противном случае запустите zcat. Результат, который на самом деле выполняется, перенаправляется в выходной файл.

shopt -s nullglob 
for d in 1 2 3 4 5; do 
    txt=(/dir1/dir2/dir3/"$d"/*.txt) 
    if ((${#txt[@]})); then 
     grep "string" "${txt[@]}" 
    else 
     zcat -f /dir1/dir2/dir3/"$a"/*.gz | grep "string" 
    fi > /path/output/"$d" 
done