2015-02-23 84 views
1

说我想所有文件复制内dirdest如何使用globstar复制目录中的所有文件?

$ tree . 
. 
├── dest 
└── dir 
    ├── dir 
    │   ├── file1 
    │   └── file2 
    └── file3 

这很容易,如果我知道文件名和目录深度:

$ echo dir/f* dir/*/* 
dir/file3 dir/dir/file1 dir/dir/file2 

$ cp dir/f* dir/*/* dest/ 

$ tree dest/ 
dest/ 
├── file1 
├── file2 
└── file3 

它也很容易(与globstar),以获得只有目录:

$ echo dir/**/*/ 
dir/dir/ 

但我不知道该怎么水珠只有文件,例如以下不工作:

$ echo dir/**/*!(/) 
dir/**/*!(/) 
+0

你是什么意思与“唯一文件”?你想排除空目录? – 2015-02-23 17:45:59

+0

(AFAIK)你不能排除扩展球的所有目录。像'*!(/)'这样的模式不起作用,'!(* /)'挂起了shell。 – 2015-02-23 17:52:49

+0

@CommuSoft:我想*排除所有的目录,比如'dir/f * dir/*/*'。 – schnittstabil 2015-02-23 18:11:24

回答

1

一种选择是使用find-type f选项:

find dir -type f -exec cp {} dest \; 
+0

这不起作用。在'-exec ... +'结构中,'{}'_'必须是command_的最后一个参数。这就是为什么'cp'的某些版本带有'-t'选项:'find dir - type f -exec cp -t dest {} +'。 – 2015-02-23 17:49:40

+0

参见[POSIX规格](http://pubs.opengroup.org/onlinepubs/009695399/utilities/find.html):_Only后面含有两个字符自变量的加号“{}”应圈点的端部主要表现。加号的其他用途不应视为特殊._ – 2015-02-23 17:51:49

+0

谢谢,但我知道这一点。 **在**中很有趣。 – schnittstabil 2015-02-23 18:09:13