搜索文件,并在每一个结果运行的脚本(Search files and run a script on

2019-11-03 11:04发布

我想知道如何搜索中的所有子目录的文件的某种模式(月/按日期明智的 - 创建子目录)。 然后,对找到的文件执行脚本。

第一步:例如:目前这种模式搜索文件TT_DETAIL*.gz

find /cygdrive/c/Test/  -name TT_DETAIL*.gz

输出#1:

/cygdrive/c/Test/Feb2014/TT_DETAIL_20141115.csv.gz
/cygdrive/c/Test/Jan2014/TT_DETAIL_20141110.csv.gz
/cygdrive/c//Test/Mar2014/TT_DETAIL_20141120.csv.gz

第2步:

zcat TT_DETAIL*.gz | awk 'BEGIN { FS=OFS=","} { if ($11=="10") print $2,$3,$6,$10,$11,$17}' >Op_TT_Detail.txt

猫Op_TT_Detail.txt

01-NOV-2014 00:30:53,AAA,ECH,1,10,XXX
01-NOV-2014 00:39:36,BBB,ECH,1,10,XXX
01-NOV-2014 00:39:44,CCC,ECH,1,10,XXX
01-NOV-2014 00:25:20,DDD,ECH,1,10,XXX

曾尝试下面的命令组合这样的,但步骤是在完成:

find /cygdrive/c/Test/  -name TT_DETAIL*.gz | xargs | zcat | awk 'BEGIN { FS=OFS=","} { if ($11=="10") print $2,$3,$6,$10,$11,$17}' >>Op_TT_DETAIL.txt

find /cygdrive/c/Test/  -name TT_DETAIL*.gz -exec ./MonthwiseData.sh {} \;

当猫MonthwiseData.sh

zcat *.gz | awk 'BEGIN { FS=OFS=","} { if ($11=="10") print $2,$3,$6,$10,$11,$17}' >>Op_TT_Detail.txt

我怎样才能做到这一点?

Answer 1:

我想while循环是处理这些情况的最佳方式:

while IFS= read -r file
do
   awk '...' <(zcat "$file")
done < <(find . -type f -name "*gz")

你有find被发送到一个命令while循环。 这样一来,就可以separatedly处理每个文件。

然后,它是执行基本的问题awk '...' <(zcat "$file")zcat "$file" | awk '...' zcat "$file" | awk '...'

你的情况:

while IFS= read -r file
do
   awk 'BEGIN { FS=OFS=","} { if ($11=="10") print $2,$3,$6,$10,$11,$17}' <(zcat "$file") >>Op_TT_Detail.txt
done < <(find /cygdrive/c/Test/  -name TT_DETAIL*.gz)

测试

我们有一些gz在当前目录下的文件:

$ for f in *gz; do echo "-- $f --"; zcat "$f"; done-- a.gz --
hello
bye
-- b.gz --
thisisB
bye

让我们find他们,并在第一行打印仅仅是第一场:

$ while IFS= read -r file; do awk 'NR==1{print $1}' <(zcat "$file") >> output; done < <(find . -type f -name "*gz")

而输出是:

$ cat output 
thisisB
hello

我认为你正在寻找的东西是这样的:

find /cygdrive/c/Test/ -name "TT_DETAIL*.gz" -print0 | \
  xargs -0 -I file zcat file | \
  awk 'BEGIN { FS=OFS=","} { if ($11=="10") print $2,$3,$6,$10,$11,$17}' >>Op_TT_Detail.txt
  • find找到的文件和-print0打印其名称。
  • xargs -0让你处理什么是从以前的管道来了。 随着-I file ,我们将其命名为file ,这样我们就可以再做zcat file | awk zcat file | awk

有趣的阅读: xargs的:如何控制和使用的命令行参数 。



Answer 2:

您可以在刻度线围住find命令创建一个参数列表,如:

awk '{print $0}' `find . -type f -name 'file*'` > concat_files.txt

一个简单的例子做同样的串联开始的“文件”真正的所有文件。 这只是刻度线我想在这里强调。



文章来源: Search files and run a script on every result