2014-09-01 6 views
0

я файлы структурированных следующим образом:Перемещение дерева каталогов лишь некоторые из файлов

folder1 
-file1.a 
-file2.b 
-file3.c 
folder2 
-file1.a 
-file2.b 
folder3 
-file1.a 
-file2.b 
-file3.c 

Я хочу, чтобы скопировать только файлы с .a и сохранением структуры дерева:

folder1 
-file1.a 
folder2 
-file2.a 
folder3 
-file3.a 

Как я могу это сделать, используя bash?

ответ

3

Если у вас есть GNU cp (li Nux) вы можете:

cp --parent folder*/**/*.a /path/to/destination 

или с двумя конвейеру tar

tar czf - folder*/**/*.a | tar -C /path/to/dest -xvf - 

или

find folder* -name \*.a -print | cpio -o | (cd /path/to/dest ; cpio -idv) 

или лучше, с замечанием @ JonathanLeffler в

find folder* -name '*.a' -print | cpio -pvd /path/to/dest 
#and with null terminated 
find ... -print0 | cpio -p0dv /path/to/dest 

** среднего(От человека Баша)

  • Соответствует любую строку, в том числе пустой строки. Когда опция оболочки globstar включена, а * используется в контексте расширения пути, два смежных * s, используемые как один шаблон, будут соответствовать всем файлам и нулевым или более каталогам и подкаталогам. Если за ним следует a, два смежных * s будут соответствуют только каталогам и подкаталогам.

globstar (по умолчанию на)

globstar Если установлено, шаблон ** используется в контексте расширительный путь к файлу будет соответствовать всем файлам и ноль или более каталогов и подкаталогов. Если за шаблоном следуют директории /, только каталоги и подкаталоги .

+0

Для чего предназначены двойные звездочки? –

+1

Я почти собирался использовать 'cpio', но вы забыли о опции' -p': 'find folder * -name '* .a' -print | cpio -pvd/path/to/dest'. _ [... прошло немного времени ...] _ У вас есть мой голос, теперь вы его исправили.(И, FWIW, Mac 'cpio' имеет опцию' -0' для обработки списков имен, завершенных нулевыми байтами, вероятно, GNU 'cpio' тоже, поэтому' find ... -print0 | cpio -p0dv/path/to/dest 'тоже будет хорошо работать. –

+0

@JonathanLeffler ДА! Youre right!;) :) Отредактировано - добавлено! – jm666

0

Один из способов - создать файл tar с необходимыми файлами ... и затем извлечь этот tar, где бы вы его ни хотели ... например. ниже

$ tar -cvf allfiles.tar `find . -name "*.a" -print` 
$ cp allfiles.tar /newdirectory 
$ cd /newdirectory 
$ tar -xvf allfiles.tar 

Другой путь был бы ...

# below command will find all files with .a extension and then 
# copy them to the newdir directory with folder structure. 
$ cp --parents `find . -name "*.a" -print` newdir 
0

Вы можете использовать for цикл:

for f in folder{1..3}; do mkdir -p "dest/$f" && cp "src/$f/file1.a" "dest/$f"; done 

Например:

$ ls src/* 
src/folder1: 
file1.a file2.b file3.c 

src/folder2: 
file1.a file2.b file3.c 

src/folder3: 
file1.a file2.b file3.c 
$ for f in folder{1..3}; do mkdir -p "dest/$f" && cp "src/$f/file1.a" "dest/$f"; done 
$ ls dest/* 
dest/folder1: 
file1.a 

dest/folder2: 
file1.a 

dest/folder3: 
file1.a 
Смежные вопросы