Команда cp для исключения копирования определенных файлов

Есть ли способ использовать команду '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=FILEFILE это имя файла, содержащего другие файлы или каталоги, которые необходимо исключить.
  • --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