команда cp, чтобы исключить копирование определенных файлов

35

Есть ли способ использовать команду «cp» для копирования каталога и исключения определенных файлов / подкаталогов в нем?

Стивен Джейкоб
источник

Ответы:

57

Используйте rsync:

rsync -avr --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination

Обратите внимание, что использование sourceи source/разные. Конечная косая черта означает копирование содержимого папки sourceв destination. Без косой черты это означает, что скопируйте исходный файл папки destination.

Кроме того, если у вас есть много каталогов (или файлов), которые нужно исключить, вы можете использовать --exclude-from=FILE, где FILE- имя файла, содержащего файлы или каталоги, которые нужно исключить.

--exclude может также содержать символы подстановки, такие как --exclude=*/.svn*

Скопировано из: https://stackoverflow.com/a/2194500/749232

Если вы хотите использовать cpсебя:

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'

Это предполагает, что структура целевого каталога такая же, как и у источника.

Скопировано из: https://stackoverflow.com/a/4586025/749232

saji89
источник
3

Позднее в игре, но вот совсем другое решение, использующее обычный bash и cp: вы можете использовать глобальную спецификацию файлов, игнорируя при этом некоторые файлы.

Предположим, что каталог содержит файлы:

$ ls *
listed1  listed2  listed3  listed4  unlisted1  unlisted2  unlisted3

Используя переменную GLOBIGNORE :

$ export GLOBIGNORE='unlisted*'
$ ls *
listed1  listed2  listed3  listed4

Или с более конкретными исключениями:

$ export GLOBIGNORE='unlisted1:unlisted2'
$ ls *
listed1  listed2  listed3  listed4  unlisted3

Или используя отрицательные совпадения :

$ ls !(unlisted*)
listed1  listed2  listed3  listed4

Это также поддерживает несколько непревзойденных шаблонов:

$ ls !(unlisted1|unlisted2)
listed1  listed2  listed3  listed4  unlisted3
xenoid
источник
1
Для отрицательных совпадений вам нужно включить расширенные глобусы: shopt -s extglobтакже вам не нужно экспортировать GLOBIGNORE: предполагается, что он изменяет поведение текущей оболочки, большинство дочерних программ не заботятся об этом.
Муру