2015-02-23 1 views
1

Скажем, я хочу, чтобы скопировать все файлы в dir для dest:Как скопировать все файлы в каталог с помощью 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

Что вы имеете в виду «только файлы»? Вы хотите исключить пустые каталоги? –

+0

(AFAIK) вы не можете исключить все каталоги с расширенными шарами. Шаблон типа '*! (/)' Не работает и '! (* /)' Висит оболочка. –

+0

@CommuSoft: Я хочу * исключить * все каталоги, например 'dir/f * dir/*/*'. – schnittstabil

ответ

1

Одним из вариантов является использование find с -type f вариант:

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

Это не работает. В конструкции '-exec ... +' '' '_' должен быть последним аргументом команды_. Вот почему некоторые версии 'cp' поставляются с опцией' -t': 'find dir - type f -exec cp -t dest {} +'. –

+0

См. [Спецификация POSIX] (http://pubs.opengroup.org/onlinepubs/009695399/utilities/find.html): _ Только знак плюса, следующий за аргументом, содержащим два символа «{}», должен акцентировать конец первичное выражение. Другие использования знака «плюс» не рассматриваются как специальные. –

+0

Спасибо, но я знаю об этом. Мне интересно в ** подталкивании **. – schnittstabil