我的情况是某些目录中存在不同类型的文件(扩展名不同)。我不知道特定目录中存在什么类型的文件。我们假设以下情况:
所有五个目录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
答案 0 :(得分: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