Answers:
如果路径名很长,则括号扩展非常有用。我用它作为备份文件的快速方法:
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
program
得到三个字:"-f file1" "-f file2" "-f file3"
不是6: "-f" "file1" "-f" "file2" "-f" "file3"
。
for
循环中使用是没有意义的,因为您可以编写for ((i=1; i<=100; i++))
并且效率更高。
创建大型目录结构时,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}}
这将为您提供与以上示例相同的目录结构。
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
)实际上没有任何作用。您可能刚刚这样做:mkdir -p dir1/subdir{1,2}/subsubdir{1,2}
。
subdir1
并 subdir2
在非字面意义。更换subdir1
用cat
和subdir2
用dog
的例子。
我用它在开发过程中将实际的测试输出与所需的测试输出进行比较。如果测试#41失败,则很容易看出测试输出(在文件tests.output / 041中)与所需输出(在文件tests.out / 041中)之间的区别:
$ diff tests.{out,output}/041
对我来说,一些常见的情况是:
重命名:
mv myText.{txt,tex}
要么
mv myText.tex{,.old}
要么
cp myText.tex{,.backup}
(尽管在最后两个任务中使用版本控制不太麻烦。)
为了进行比较(已经提到):
diff path{1,2}/a.txt
这里有几个很好的答案,但是没有一个提到何时不使用括号扩展。像其他应答程序一样,我在命令行上使用了大括号扩展。我也可以在别名和函数中使用它,因为我可以期待使用智能外壳。
我没有在我的shell脚本中使用它(除非出于某些其他原因,这些脚本应该是bash或zsh,尽管在这种情况下,最好升级为“” perl
或“真正的”脚本语言python
)。 Brace扩展不可移植,因为它不在POSIX Shell标准中。即使它在你的/bin/sh
- 家当编辑shell脚本,它不会有更多的剥离系统的工作/bin/sh
壳(例如dash
)。
如果是个位数的差异,则不需要大括号扩展;一个字符类就足够了:
Bashism:
diff file{1,2}
便携式:
diff file[12]
file{1,2}
它将始终扩展为file1 file2
,而file[12]
仅扩展为现有的文件名:即,如果file1
存在但file2
不存在,则file[12]
扩展为file1
仅。该[]
扩展实际上是扩展的受限版本?
(它们称为“路径名扩展”)。
program -f file1 -f file2 -f file3
,您可以做program "-f file"{1..3}