什么时候使用大括号扩展?

Ben*_*min 57 shell bash ksh zsh brace-expansion

我了解什么是大括号扩展,但我不知道如何最好地使用它。

你什么时候使用它?
如果你有自己的小窍门,请教我一些方便和出色的例子。

dog*_*ane 59

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

cp /a/really/long/path/to/some/file.txt{,.bak}
Run Code Online (Sandbox Code Playgroud)

将复制/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
Run Code Online (Sandbox Code Playgroud)

或者

for i in {1..100}
do
   #do something 100 times
done
Run Code Online (Sandbox Code Playgroud)

  • 这也可以用于参数复制。假设您有一些程序需要一个“-f”参数来操作每个文件。而不是做`program -f file1 -f file2 -f file3`,你可以做`program "-f file"{1..3}` (8认同)
  • @Patrick:那失败了,因为`program` 得到三个词:`"-f file1" "-f file2" "-f file3"`,而不是 6: `"-f" "file1" "-f" "file2" “-f”“文件 3”`。 (2认同)

Chr*_*ian 36

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

mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}
Run Code Online (Sandbox Code Playgroud)

这会给你

find dir1 -type d
dir1
dir1/subdir1
dir1/subdir1/subsubdir1
dir1/subdir1/subsubdir2
dir1/subdir2
dir1/subdir2/subsubdir1
dir1/subdir2/subsubdir2
Run Code Online (Sandbox Code Playgroud)

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

mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
Run Code Online (Sandbox Code Playgroud)

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

  • 嵌套很好,但是您的嵌套示例 (`mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}`) 实际上没有任何用途。你可以这样做:`mkdir -p dir1/subdir{1,2}/subsubdir{1,2}`。 (3认同)
  • @ephsmith:如果您将“subdir1”解释为“cat”代表“subdir2”,“dog”代表“subdir2”,则嵌套示例失败,因为它使用 subdir{1,2},并且没有可以替换的字符串"subdir" 将使 subdir{1,2} 返回 {cat,dog}。 (2认同)

tsh*_*ang 23

当我想减少打字时,我会使用它:

geany /path/to/file1 /path/to/file2
# versus
geany /path/to/file{1,2}
Run Code Online (Sandbox Code Playgroud)

另一个例子:

wajig install libpam0g-dev libiw-dev libdb-dev
# versus
wajig install lib{pam0g,iw,db}-dev
Run Code Online (Sandbox Code Playgroud)


Bru*_*ger 13

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

$ diff tests.{out,output}/041
Run Code Online (Sandbox Code Playgroud)


imz*_*hev 11

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

重命名:

mv myText.{txt,tex}
Run Code Online (Sandbox Code Playgroud)

或者

mv myText.tex{,.old}
Run Code Online (Sandbox Code Playgroud)

或者

cp myText.tex{,.backup}
Run Code Online (Sandbox Code Playgroud)

(尽管对最后 2 个任务使用版本控制没那么麻烦。)

为了比较(已经提到):

diff path{1,2}/a.txt
Run Code Online (Sandbox Code Playgroud)