2015-02-23 80 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