У меня есть ситуация, когда в некоторых каталогах есть разные типы файлов (разных расширений). Я не знаю, какой тип файла присутствует в определенном каталоге. Давайте предположим, что следующий случай:Как разбирать файлы в соответствии с их расширением
Существует общий путь для всех пяти каталогов 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
Вы отредактировали попытку, которая должна работать до тех пор, пока вы используете 'shopt -s nullglob'. Это предотвращает ввод одного или другого цикла 'for'. Если по какой-либо причине вы получаете файлы 'gz' и' txt' в том же каталоге, результат цикла 'gz' будет перезаписывать результат цикла' txt'. – chepner
@chepner Да. Это прекрасно, если я перенаправляю вывод в разные каталоги - один для .txt и один для .gz. – intruder