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