你对“合并”的定义是什么?您的 Perl 脚本是否采用文件名参数?您的文件名是否曾经包含空格或其他尴尬的字符?
假设您的脚本不接受命令行参数,您可以执行以下操作之一:
cat $(find $FOLDER -name "*.txt") | ./some-processing-script.pl >$TARGET
或者,如果单个命令行的文件太多,则:
find $FOLDER -name "*.txt" -print | xargs cat | ./some-processing-script.pl > $TARGET
或者,如果您的名称中有空格并且足够现代find
(符合 POSIX 2008):
find $FOLDER -name "*.txt" -exec cat {} + | ./some-processing-script.pl > $TARGET
如果您真的想始终附加到目标文件,则将 替换>
为>>
. 在这些示例中,cat
is 用于连接多个文件,这是cat
. UUOC(无用的使用cat
)奖与使用cat
在 I/O 重定向将完成工作时处理单个文件一起使用。
如果您负责 Perl 脚本,则应将其修改为“标准过滤器”,即读取命令行上指定的文件的程序,如果没有指定文件,则读取标准输入。然后,您可以消除cat
:
./some-processing-script.pl $(find $FOLDER -name "*.txt") >$TARGET
find $FOLDER -name "*.txt" -print | xargs ./some-processing-script.pl > $TARGET
find $FOLDER -name "*.txt" -exec ./some-processing-script.pl {} + > $TARGET
在这些选项中,最后一个是我将使用的选项,假设 Perl 脚本接受或可以修改为接受命令行上的文件名。如果 Perl 脚本不能(被要求)处理命令行参数,那么我将使用带有cat
and 管道的第三个命令。但这说明了为什么您应该尽可能设计程序(Perl 脚本)以使其表现得像标准的 Unix 过滤器。这意味着您可以更有效地将它们组合到命令管道中。