Есть ли способ использовать команду «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
Используя переменную 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
shopt -s extglob
также вам не нужно экспортироватьGLOBIGNORE
: предполагается, что он изменяет поведение текущей оболочки, большинство дочерних программ не заботятся об этом.