2013-05-06 1 views
1

Итак, я хочу переместить все .xml из одного каталога (с подкаталогами) в новый каталог; однако, если файлы находятся в подкаталогах, я хочу, чтобы они оставались в подкаталогах. В принципе, у меня есть куча файлов, которые уже классифицированы, и я хочу только их подмножество, но мне все еще нужно, чтобы они оставались раздельными. Я написал эту простую команду, которая будет проходить через все XML-файлы в моих Д и его подкаталогах, но это помещает все в один каталог:Переместите все файлы заданного типа из каталога в другой каталог, но сохраните иерархию каталогов (см. Пояснение)

find . -name "*.xml" -exec mv {} ~/Desktop/test/ \; 

Я не знаю, как создать новый подраздел -directories через эту команду/отправить каждый файл в соответствующее новое место. Я понимаю, что я могу сделать это через perl или какой-либо другой язык, но я хотел бы иметь возможность делать это с помощью команд терминала (я пытаюсь научиться играть с bash).

Заранее спасибо.

+0

Спасибо за все ответы ! –

ответ

6

Использование tar для копирования файлов со структурой каталогов:

find . -name "*.xml" -print0 | 
tar -cf - --null -T- | 
tar -C ~/Desktop/test/ -xf - 

В качестве альтернативы, вы можете использовать cp с опцией --parents:

find . -name "*.xml" -exec cp -a -t ~/Desktop/test/ --parents {} + 
+0

Довольно уверен, что '-f -' является избыточным,' tar' использует stdin/stdout по умолчанию – Kevin

+0

+1 для приятного использования tar. – jbr

+0

Вы имели в виду '-name" * .xml "', правильно? –

2

Вы можете попробовать что-то вроде:

find . -name "*.xml" -exec sh -c 'mkdir -p ~/Desktop/`dirname "{}"`; mv "{}" ~/Desktop/`dirname "{}"`' \; 
+0

Оригинальный вопрос касался перемещения файлов, и этот ответ делает именно это. Другой ответ на все касается копирования файлов, которые не перемещаются! Во всяком случае, мне нужно было переместить мои фильмы из папок с фотографиями, сохраняя одну и ту же иерархию, и это решило эту проблему. Благодаря! – Pierre

1

Для некоторых ситуаций мне нравится е cpio команда

any_command_what_produces_relative_path_names | cpio -pamVd /new/parent/dir 

, например:

find . -name \*.xml -print0 | cpio -pamvd0 /new/parent/dir 

или с фильтрацией выходного находку

find . -name \*.xml -print0 |\ 
    grep -zP 'only_some_of_them' |\ 
    cpio -pamvd0 /new/parent/dir 

или только те, какие содержит строку "BlaBla"

find . -name \*.xml -print0 |\ 
    xargs -0 grep -zl "blabla" |\ 
    cpio -pamvd0 /new/parent/dir 
Смежные вопросы