Как разобрать файлы по расширению

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

Для всех пяти каталогов 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? Пожалуйста, предложите?

Редактировать:

Я также попробовал следующее:

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

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
Другие вопросы по тегам