我需要为程序提供一些特定文件,以正确的顺序并两两分组。
如果我有
A_file.txt
B_file.txt
C_file.txt
D_file.txt
我需要将它提供给一个程序,以便首先处理文件 A 和 B,然后是 C 和 D,依此类推。在本质上:
for i in *.txt; do
some_program A_file.txt B_file.txt > output_AB
some_program C_file.txt D_file.txt > output_CD
我知道以上没有意义,但它是为了说明这一点。本质上,遍历.txt
文件夹中的所有文件,但将它们一次提供给程序两个,然后移至下两个。
正在学习,非常感谢。
这会将位置参数设置为您感兴趣的文件名列表,基于与问题中的名称匹配的文件名通配模式。然后它使用循环迭代此列表,直到列表中剩下的名字少于两个(
$#
是位置参数列表的长度)。在每次迭代中,处理列表的前两个元素
$1
和$2
,然后使用 将其移出列表shift 2
。处理的输出被重定向到一个名为的文件,
output_
后跟两个文件名的可变部分的串联(无论_file.txt
每个文件中的静态字符串之前是什么)。这假定文件的命名方式是按字典顺序对名称进行排序(通配模式的扩展将执行此操作)会生成一个名称列表,这些名称可以按照问题中显示的方式进行配对。
您可以使用
xargs
命令执行此操作。如果我有这些文件:然后我可以像这样一次处理这两个:
在这里,我只是调用
echo
,但您当然可以删除echo
并实际运行some_program
。这将一次处理两个文件......但它不处理为每次调用生成输出文件名。如果我们做得更详细一点,我们可以输出到一个以第一个输入文件名命名的文件:
这将为
A_file.txt.output
和A_file.txt
、B_file.txt
下一C_File.txt.output
对等生成文件。您可以通过应用各种转换来更好地了解输出文件名;例如,要获取您在问题中要求的文件名,您可以这样写:这将生成输出文件名
output_AB
,output_CD
等等。如果从 bash 切换到 zsh 是一种选择,那么它只是:
(N)
从那个 glob 扩展中启用 nullglob,以便在没有匹配项时不报告错误。如果文件数量为奇数,则最后一次运行将
$j
设置为空字符串。当我们在 argument to 中不加引号时some_program
,这将导致没有相应的参数传递给它。"$j"
在这种情况下,如果您希望将空参数传递给它,请替换为。*.txt
扩展将按字母顺序排列;o
您可以使用,O
和/或n
glob 限定符将顺序更改为您想要的任何顺序。对于每次迭代的任意数量的文件,而不是仅仅 2 个:
或使用
zargs
:在
${(Mj[])array#?}
,${array#?}
中将从数组的每个元素中去除前导字符,但在 中M
,返回的是M
atched 的内容。结果是j
空的 ([]
),所以你得到一个由每个元素的第一个字符组成的字符串。将文件列表转储到数组中并从中读取。
如果你有奇数个文件,请求
${arr[ $[$i+1] ]}
会默默地给你一个空字符串。由您决定在这种情况下要做什么。