展开多个文件而不重复长路径

时间:2015-02-11 12:31:51

标签: bash

有时我想要从另一个目录中复制两个或三个文件的目录中。

所以,让我们说我在一个空目录中,情况是这样的:

user@hisBox:~/really/deep/directory/structure
$ pwd
/home/user/really/deep/directory/structure

现在我想从一个看起来像这样的远程目录中复制两个文件(a.txt和b.txt):

user@hisBox:~/really/deep/directory/structure
$ ls /home/user/really/deep2/bla/foo/textfolder
a.txt b.txt c.txt d.txt e.txt

我想输入的内容是这样的:

user@hisBox:~/really/deep/directory/structure
$ cp ../../../deep2/bla/foo/textfolder/{a.txt, b.txt} .

应该导致这个

user@hisBox:~/really/deep/directory/structure
$ ls
a.txt b.txt

是否有可用的语法允许我在bash中执行此操作?

1 个答案:

答案 0 :(得分:4)

是的(你已经在那里了):

cp ../../../deep2/bla/foo/textfolder/{a,b}.txt .

会将文件a.txtb.txt复制到当前目录。这称为brace expansion

正如gniourf_gniourf在评论中指出的那样,您也可以使用extended globbing来执行此操作:

shopt -s extglob
cp ../../../deep2/bla/foo/textfolder/@(a|b).txt .

@()表示将复制与管道分隔选项之一匹配的任何文件。

这两个选项之间的区别在于第一个选项扩展为:

cp ../../../deep2/bla/foo/textfolder/a.txt ../../../deep2/bla/foo/textfolder/b.txt

这两个文件是否存在,而第二个只会扩展到它匹配的文件。再次感谢gniourf_gniourf的解释。