【发布时间】:2018-12-19 13:59:15
【问题描述】:
假设我有一个目录,内容如下:
$ ls
file1.csv.gz
file2.csv.gz
file3.csv.gz
file4.csv.gz
listOfFiles.txt
listOfFiles.txt 包含我想要 zcat 和管道到 awk 以处理其内容的文件列表。例如,listOfFiles.txt 可能包含以下内容:
$ cat listOfFiles.txt
file2.csv.gz
file3.csv.gz
在这种情况下,我希望 zcat 对 file2.csv.gz 和 file3.csv.gz 进行操作,而不是对目录中的任何其他文件进行操作。一种方法是(编辑:根据 cmets 从xargs zcat {} 中删除{}):
cat listOfFiles.txt | xargs zcat | awk ...
但我想知道是否有更简洁的方式让zcat 可以从listOfFiles.txt 读取文件名。它必须能够处理任意长的文件名列表,xargs 处理得很好,理想情况下,它只会为listOfFiles.txt 的全部内容调用一次zcat,而不是@987654334 中包含的每个文件一次@。
【问题讨论】:
-
既然你说列表可以任意长,我没有看到比
xargs更好的解决方案来减少对zcat的调用次数。 -
需要明确的是,
xargs已经在默认情况下尝试将参数合并到尽可能少的命令调用中,因此它将运行zcat file2.csv.gz file3.csv.gz——而不是zcat file2.csv.gz,然后是@ 987654340@ -- 如果调用时使用完整的默认值(无-I、-J、-n等)。{}仅在-I {}前面才有意义,但最佳做法是不要在此处使用该选项。