如何将一个目录中的多个文件引用到一个命令

如何将一个目录中的多个文件引用到一个命令

我有一个命令需要获取多个输入文件,这些文件最初来自一个目录并且具有特定的文件名模式。例如:

在目录中

/home/mydir/

我有文件:

A.dat
B.dat
C.dat
readme.doc

我想了解如何将所有以“.dat”结尾的文件传递给此命令,该命令应如下所示:

command A.dat B.dat C.dat > /home/outputdir/output.dat

我可以在 python 中做到这一点,例如通过将文件名存储在列表中,但是我应该如何在 shell 中做到这一点?多谢。

答案1

标准 UNIX shell 会做一些称为通配;这使用特殊字符来表示,例如,一个字符 ( ?) 或任意数量的字符 ( *)。要使用您的示例,您可以运行(其中首字母$代表您的命令提示符,而不是您输入的内容):

$ command /home/mydir/*.dat > /home/outputdir/output.dat

您的 shell 会将其扩展为:

$ command /home/mydir/A.dat /home/mydir/B.dat /home/mydir/C.dat > /home/outputdir/output.dat

在实际调用命令之前。上面说*“获取 /home/mydir 中以“.dat”结尾的所有文件名。

对于命令的某些变体,给定相同的输入文件:

# all of the sample input files have a single letter before the ".dat"
$ command /home/mydir/?.dat > /home/outputdir/output.dat

# the square brackets say "any (one) of these characters"
$ command /home/mydir/[ABC].dat > /home/outputdir/output.dat

答案2

答案实际上取决于您尝试使用什么工具。有些设计为接受多个文件作为参数,可以通过以下方式完成:

/path/to/some/tool file1 /path/to/file2 /path/to/lotsafiles/*

其他的设计为只接受一个文件作为参数,因此必须对您想要寻址的每个文件重复调用,这可以这样完成:

for file in file1 /path/to/file2 /path/to/lotsafiles/*; do
    /path/to/some/tool "$file"
done

要了解是否必须一次只指定一个文件,请参阅程序的手册页 ( man tool)。

相关内容