69

В командной строке Linux я хотел бы скопировать (очень большой) набор файлов .txt из одного каталога (и его подкаталогов) в другой.

Мне нужно, чтобы структура каталогов оставалась неизменной, и мне нужно игнорировать файлы, кроме тех, которые заканчиваются на .txt .

7 ответов7

92

Вы можете использовать find и cpio для этого

cd /top/level/to/copy
find . -name '*.txt' | cpio -pdm /path/to/destdir

(-updm for overwrite destination content.)
7
cd /source/path
find -type f -name \*.txt -exec install -D {} /dest/path/{} \;
2

Другой подход

find . -name '*.txt' -exec rsync -R {} path/to/dext \;

1

Самый простой способ, который работал для меня:

cp --parents -R jobs/**/*.xml ./backup/

одна загвоздка в том, что вам нужно перейти в "нужный" каталог, прежде чем "родительский путь" будет правильным.

Также убедитесь, что вы включили рекурсивные глобусы в bash:

shopt -s globstar
1

как насчет того, чтобы сначала скопировать

cp -r /old/folder /new/folder

затем перейдите в новую папку и запустите

find . -type f ! -iname "*.txt" -delete

или просто

cp -r /old/folder /new/folder && find . -type f ! -iname "*.txt" -delete

Изменить: хорошо, вы хотите одну команду, которая фильтрует (я не проверял это, потому что в моей системе нет команды cpio !). Вот где я нашел это: http://www.gnu.org/software/findutils/manual/html_mono/find.html#Copying-A-Subset-of-Files

find . -name "*.txt" -print0 |
     cpio -pmd0 /dest-dir

Пожалуйста, сначала проверьте это, потому что я еще не пробовал. Если бы кто-то проверил, это было бы здорово.

0

Перейдите в каталог:

find . -regex '<regexp_to_get_directories_and_files_you_want>' | xargs -i cp -r --parents {} path/to/destination

Это немного проще и мощнее, если вы управляете регулярными выражениями.

-1

Перейдите в каталог:

cp '*.css' /path/to/destination

Вам придется перейти к каждой папке в каталоге, но это лучше, чем большинство вариантов, которые я видел до сих пор.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .