Есть ли способ использовать команду 'cp' для копирования каталога и исключения определенных файлов / подкаталогов в нем?
Используйте rsync
:
rsync -av --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
Поздно в игру, но вот совсем другое решение с помощью простого удара и 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