我有一个命令需要获取多个输入文件,这些文件最初来自一个目录并且具有特定的文件名模式。例如:
在目录中
/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
)。