2013-03-25 3 views
50

В unix я хочу скопировать все файлы с определенным расширением (все файлы excel) из всех подкаталогов в другой каталог. У меня есть следующие команды:Скопировать все файлы с определенным расширением из всех подкаталогов

cp --parents `find -name \*.xls*` /target_directory/ 

Проблема с этой командой:

  • Он копирует структура каталогов, а также, и я только хочу файлы (так что все файлы должны оказаться в/целевой_каталог /)

  • Это не копирует файлы с пробелами в именах файлов (которые довольно мало)

Любые решения для этих проблем?

+0

Как насчет 'find ... exec mv'? – fedorqui

ответ

86

--parents копирует структуру каталогов, поэтому вам следует избавиться от этого.

, как вы написали это, find исполняет, а выход помещаются в командной строке таким образом, что cp не может различать между пространствами, разделяющих именами файлов и пространствами в имени файла. Это лучше сделать что-то вроде

$ find . -name \*.xls -exec cp {} newDir \; 

, в котором cp выполняется для каждого файла, который find находит, и правильно передается имя файла. Here's more info по этой методике.

Вместо всего вышесказанного, можно использовать zsh и просто введите

$ cp **/*.xls target_directory 

zsh может расширить символы включить подкаталоги и делает этот вид вещи очень легко.

+0

Извините за мою неграмотность bash, но что вы подразумеваете под «bin»? – Abdel

+0

Бросьте в корзину. – bmargulies

+1

Да. «bin it» означает выбросить его. Теперь исправлены :-) –

5

У меня была аналогичная проблема. Я решил его с помощью:

find dir_name '*.mp3' -exec cp -vuni '{}' "../dest_dir" ";" 

'{}' и ";" выполняет копию на каждый файл.

11

Из всего вышеизложенного я придумал эту версию. Эта версия также работает для меня в терминале восстановления Mac.

find ./ -name '*.xsl' -exec cp -prv '{}' '/path/to/targetDir/' ';' 

Он будет выглядеть в текущем каталоге и рекурсивно во всех подкаталогах файлов с расширением xsl. Он скопирует их все в целевой каталог.

CP флаги:

  • р - сохранить атрибуты файла
  • г - рекурсивный
  • v - многословным (показывает, Что копируется)
+1

Это то же самое, что я должен был делать, когда SSH'd в Bluehost. – Plummer

1

Я также имел сделать это сам.Я сделал это через аргумент --parents для cp:

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \; 
Смежные вопросы