外壳扩展(A | B)的文件名?


9

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

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

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

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

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

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

Answers:


16

匹配数字的标准文件名浮动模式是[0-9]。这与一位数字匹配:

cat file[0-9].txt

要仅选择其中两个:

cat file[25].txt

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

cat file{25..60}.txt

同样,括号扩展也允许单个数字:

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

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

在中bash,在extglob启用外壳程序选项(shopt -s extglob)的情况下,以下内容也将起作用:

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

@(...)模式将与包含的定|界模式中的任何一种匹配。


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

例:

touch file1

ls file[0-9]

在这里,仅显示的文件列表file1

使用ls file{0..9}ls会抱怨找不到内容file0file2等等。

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

touch file[0-9]

touch file{0..9}

@thecarpy对不起,但这不是匹配eg的模式file45.txt。方括号表达式的[...]工作方式与正则表达式相同,但是用于!代替^“ not in”。一个[...]模式将始终匹配单个字符。
Kusalananda

你是对的!顺便说一句,我{1,2}也不兼容POSIX ...今天学到了一些新知识!
–thecarpy

2
大括号扩展不需要与实际文件匹配的事实可能非常有用,如果您正在使用大括号扩展(例如)生成要传递给的模式grep,生成要传递给的URL curl等等,但是这也可能造成混淆那些习惯使用glob的人。
凯文(Kevin)

@凯文正确。大括号扩展名不必与文件名有关。
库沙兰丹

7

使用的语法file{1,2}file1file2

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

正如Inian在下面指出的那样... touch file{1..9}在此示例情况下,这样做会更容易...

$ 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)文件。


1
使用此file{1,2} 语法也可以方便地重命名文件:mv some_very_long_filename.txt{,.bak}
Eric Duminil,

6

是的,您可以在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

2
是的,不用担心文件不在那儿,我只想显示数字编号的2个文件的内容,但是它们不是连续的,所以file{1,5}我只缺少逗号语法!
乔·希利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.