Есть ли способ использовать команду '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