Есть ли способ использовать команду 'cp' для копирования каталога и исключения определенных файлов / подкаталогов внутри него?
Воспользуйся 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
В конце игры, но вот совсем другое решение, использующее обычный bash и cp: вы можете использовать глобальную спецификацию файла, игнорируя при этом некоторые файлы.
Предположим, что каталог содержит файлы:
$ ls *listed1 listed2 listed3 listed4 unlisted1 unlisted2 unlisted3Используя ГЛОБИНЬОРЕ переменная:
$ 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
быстрый старт
Бежать:
rsync -av --exclude='path1/in/source' --exclude='path2/in/source' [source]/ [destination]Записи
-
-avrсоздаст новый каталог с именем[destination]. -
sourceиsource/создавайте разные результаты:-
source— скопируйте содержание из источника в пункт назначения. -
source/— скопируйте папка источник в пункт назначения.
-
- Чтобы исключить много файлов:
-
--exclude-from=FILE—FILEэто имя файла, содержащего другие файлы или каталоги, которые необходимо исключить.
-
-
--excludeможет также содержать подстановочные знаки:- напр.
--exclude=*/.svn*
- напр.
Модифицированный из: https://stackoverflow.com/a/2194500/749232
Пример
Начальная структура папок:
.├── destination└── source ├── fileToCopy.rtf └── fileToExclude.rtfБежать:
rsync -av --exclude='fileToCopy.rtf' source/ destinationОкончание структуры папок:
.├── destination│ └── fileToExclude.rtf└── source ├── fileToCopy.rtf └── fileToExclude.rtf