Answers:
匹配数字的标准文件名浮动模式是[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
会抱怨找不到内容file0
,file2
等等。
在以下示例中,第一个命令将仅触摸与给定模式匹配的现有名称,而第二行将创建尚不存在的文件:
touch file[0-9]
touch file{0..9}
{1,2}
也不兼容POSIX ...今天学到了一些新知识!
grep
,生成要传递给的URL curl
等等,但是这也可能造成混淆那些习惯使用glob的人。
使用的语法file{1,2}
为file1
和file2
。
$ 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(9
次26
)文件。
file{1,2}
语法也可以方便地重命名文件:mv some_very_long_filename.txt{,.bak}
是的,您可以在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
file{1,5}
我只缺少逗号语法!
file45.txt
。方括号表达式的[...]
工作方式与正则表达式相同,但是用于!
代替^
“ not in”。一个[...]
模式将始终匹配单个字符。