什么时候使用括号扩展?


Answers:


52

如果路径名很长,则括号扩展非常有用。我用它作为备份文件的快速方法:

cp /a/really/long/path/to/some/file.txt{,.bak}

将复制/a/really/long/path/to/some/file.txt/a/really/long/path/to/some/file.txt.bak

您也可以按顺序使用它。我曾经这样做是为了从网上下载很多页面:

wget http://domain.com/book/page{1..5}.html

要么

for i in {1..100}
do
   #do something 100 times
done

8
这也可以用于参数重复。假设您有一些程序,每个文件都需要一个-f参数。而不是做program -f file1 -f file2 -f file3,您可以做program "-f file"{1..3}
Patrick

真可惜 我只是发现了它,但多年来却一直在不知道长丝的情况下在超长路径上执行备份操作。谢谢。
smonff

2
@Patrick:失败是因为program得到三个字:"-f file1" "-f file2" "-f file3"不是6: "-f" "file1" "-f" "file2" "-f" "file3"
musiphil

@dogbane:使用扩展在for循环中使用是没有意义的,因为您可以编写for ((i=1; i<=100; i++))并且效率更高。
musiphil

30

创建大型目录结构时,Brace扩展非常方便:

mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}

这会给你

find dir1 -type d
dir1
dir1/subdir1
dir1/subdir1/subsubdir1
dir1/subdir1/subsubdir2
dir1/subdir2
dir1/subdir2/subsubdir1
dir1/subdir2/subsubdir2

您甚至可以更进一步,将括号扩展放入括号扩展中:

mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}

这将为您提供与以上示例相同的目录结构。


3
嵌套很好,但是您的嵌套示例(mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}})实际上没有任何作用。您可能刚刚这样做:mkdir -p dir1/subdir{1,2}/subsubdir{1,2}
iconoclast

@iconoclast,它服务于一个目的,如果你理解subdir1subdir2在非字面意义。更换subdir1catsubdir2dog的例子。
伊夫史密斯2012年

2
@ephsmith:如果您将“ subdir1”解释为“ cat”的代表,将“ subdir2”解释为“ dog”的代表,则嵌套示例将失败,因为它使用了subdir {1,2},并且没有可替换的字符串带有“ subdir”的子目录将使subdir {1,2}返回{cat,dog}。
iconoclast

21

我想减少打字时使用它:

geany /path/to/file1 /path/to/file2
# versus
geany /path/to/file{1,2}

另一个例子:

wajig install libpam0g-dev libiw-dev libdb-dev
# versus
wajig install lib{pam0g,iw,db}-dev

12

我用它在开发过程中将实际的测试输出与所需的测试输出进行比较。如果测试#41失败,则很容易看出测试输出(在文件tests.output / 041中)与所需输出(在文件tests.out / 041中)之间的区别:

$ diff tests.{out,output}/041

10

对我来说,一些常见的情况是:

重命名:

mv myText.{txt,tex}

要么

mv myText.tex{,.old}

要么

cp myText.tex{,.backup}

(尽管在最后两个任务中使用版本控制不太麻烦。)

为了进行比较(已经提到):

diff path{1,2}/a.txt

3

这里有几个很好的答案,但是没有一个提到何时使用括号扩展。像其他应答程序一样,我在命令行上使用了大括号扩展。我也可以在别名和函数中使用它,因为我可以期待使用智能外壳。

没有在我的shell脚本中使用它(除非出于某些其他原因,这些脚本应该是bash或zsh,尽管在这种情况下,最好升级为“” perl或“真正的”脚本语言python)。 Brace扩展不可移植,因为它不在POSIX Shell标准中。即使它在你的/bin/sh- 家当编辑shell脚本,它不会有更多的剥离系统的工作/bin/sh壳(例如dash)。

如果是个位数的差异,则不需要大括号扩展;一个字符类就足够了:

Bashism:

diff file{1,2}

便携式:

diff file[12]

3
不同之处在于,file{1,2}它将始终扩展为file1 file2,而file[12]仅扩展为现有的文件名:即,如果file1存在但file2不存在,则file[12]扩展为file1仅。该[]扩展实际上是扩展的受限版本?(它们称为“路径名扩展”)。
musiphil

正确,括号扩展不是shell遍历(也就是路径名扩展)。这是一个尚未真正提及的好方法:大括号扩展可以更好地指出出人意料的缺少路径。您也可以在括号扩展中进行全局调整。
亚当·卡兹
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.