文件名中的 shell 扩展 (A|B)?

文件名中的 shell 扩展 (A|B)?

or例如,读取文件时是否可以在 shell 中扩展选择。

我的意思是,例如,支持匹配文件中的 A 或 B 之grep类的语法。(A|B)

同样,如果我有这些文件:

file1.txt
file2.txt
file3.txt
file4.txt
file5.txt

我可以做cat file{1..5}.txtin bash,因为它扩大了范围。是否有等效的方法可以仅对几个文件执行此操作?

例如cat file(1|5).txt,只打印那 2 个?

答案1

要匹配的标准文件名通配模式一个数字[0-9]。这匹配单个数字:

cat file[0-9].txt

仅选择其中两个:

cat file[25].txt

对于大于 9 的数字,大括号扩展将很有用(但请参阅下面的注释,了解通配模式和大括号扩展之间的区别):

cat file{25..60}.txt

同样,大括号扩展也允许单独的数字:

cat file{12,45,900,xyz}.txt

(请注意,在上面的示例中,大括号扩展不涉及算术循环,而只是根据提供的字符串生成名称)。

在 中bashextglob启用 shell 选项 ( shopt -s extglob) 后,以下操作也将起作用:

cat file@(12|45|490|foo).txt

@(...)模式将匹配任何一个包含的|- 分隔模式。


[...]通配符模式作为和以及大括号扩展之间的区别在于@(...),大括号扩展是在命令行生成并且实际上可能与当前目录中的任何现有名称不匹配。文件名通配模式将匹配名称,但如果并非所有可能的名称都存在,shell 不会抱怨。如果如果存在匹配的名称,则该模式将保持未展开状态,除非还nullglob设置了 shell 选项,在这种情况下该模式将被删除。

例子:

touch file1

ls file[0-9]

file1此处,仅显示文件列表。

有了ls file{0..9}ls就会抱怨找不到file0file2等等。

在以下示例中,第一个命令将仅触及现有名称与给定模式匹配,而第二行将创建尚不存在的文件:

touch file[0-9]

touch file{0..9}

答案2

要使用的语法是file{1,2}which 的计算结果为file1file2

$ ls
$ touch file{1,2,3,4,5,6,7,8,9}
$ ls
file1  file2  file3  file4  file5  file6  file7  file8  file9

touch file{1..9}正如 Inian 在下面指出的那样......在这个例子中会更容易做到......

$ ls
$ touch file{1..9}
$ ls
file1  file2  file3  file4  file5  file6  file7  file8  file9

您还可以使用多个表达式,例如:

$ ls
$ touch file{1..9}{a..z}
$ ls
file1a file1b file1c
[...]
file9x file9y file9z

是的,上面将创建 234(926)个文件。

答案3

是的,您可以在 shell 中使用大括号扩展bash。对于几个文件,只需执行file{1..2}或就像file{1,2}

或者,如果您担心在某些情况下文件不存在,只需执行一个简单的循环,

for file in file{1..4}.txt; do
    [ -f "$file" ] || continue
    echo "$file" # Do other actions on file here
done

或者,如果只是连接是您对文件的唯一操作,并且如果您是不确定哪些文件在任何时候都不可能存在,只显示cat它们并抑制错误。/dev/null如果文件不可用,则将标准错误重定向到将抑制错误。

cat file{1,5}.txt 2>/dev/null

或者使用 glob 表达式file[15],如果找不到文件,它不会抱怨错误。

cat file[15].txt

相关内容