在 for 循环中迭代文件组

在 for 循环中迭代文件组

我有一组这样的文件:

A1.xlsx
A2.xlsx
B1.xlsx
C1.xlsx
C2.xlsx

我只知道前缀(A、B、C),但名称的其余部分事先未知,文件数量也是如此。我需要调用一些命令,向它们传递这些文件组,如下所示:

mycommand A*.xlsx
mv A*.xlsx tmp/
mycommand B*.xlsx
mv B*.xlsx tmp/
mycommand C*.xlsx
mv C*.xlsx tmp/

我已经尝试了不同的循环语法for fileGroup in A* B* C*,但我只能将文件名一一传递给,或者只对所有文件mycommand调用一次。 mycommandbash 中有执行此操作的语法吗?

答案1

假设您知道并且可以对前缀进行硬编码:

for p in A B C D; do
    mycommand "$p"*.xlsx
    mv "$p"*.xlsx tmp/
    ...
done

答案2

对所有这些都使用 glob 表达式。对于以AB或开头的文件C

<mycommand> [ABC]*.xlsx
mv -t tmp/ -- [ABC]*.xlsx

这里是一本关于全球的好读物。


如果您需要执行不接受许多文件参数的命令,则必须为每个参数调用单独的进程,但您仍然可以使用相同的 glob 选择它们:

for f in [ABC]*.xlsx; do
    <some_command> "$f"
done

相关内容