Чи є спосіб використовувати команду '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
: це повинно змінити поведінку поточної оболонки, більшість дочірніх програм це не хвилює.