Я хочу скопіювати всі файли в каталог, крім деяких файлів у певний підкаталог. Я помітив, що команда 'cp' не мала опції --exclude. Отже, як я можу цього досягти?
tar -c | tar -x
?
Я хочу скопіювати всі файли в каталог, крім деяких файлів у певний підкаталог. Я помітив, що команда 'cp' не мала опції --exclude. Отже, як я можу цього досягти?
tar -c | tar -x
?
Відповіді:
rsync - це швидко і легко:
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude
Ви можете використовувати --exclude
кратні рази.
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
Зауважте, що варіант dir thefoldertoexclude
after --exclude
є відносном sourcefolder
, тобто sourcefolder/thefoldertoexclude
.
Також ви можете додати -n
для сухого запуску, щоб побачити, що буде скопійовано перед виконанням реальної операції, і якщо все в порядку, видаліть -n
з командного рядка.
--exclude
thefoldertoexclude
відносном sourcefolder
чи поточним робочим режимом? дякую
rsync -av --progress --exclude="thefoldertoexclude" sourcefolder /destinationfolder
- у будь-якому випадку, підсилюйте rsync замість знахідки, оскільки ви можете легко використовувати абсолютні шляхи до джерела, тоді як у знаходженні це складніше, як це використовується {}
у dst.
$ rsync user@example.com:/var/www/mypage /var/www/mylocalpage/
або з локального на віддалений$ rsync /var/www/mylocalpage/ user@example.com:/var/www/mypage
Добре, якщо виключення певних шаблонів імен файлів довелося виконувати кожною утилітою файлу unix-ish (наприклад, cp, mv, rm, tar, rsync, scp, ...), виникне величезне дублювання зусиль. Натомість такі речі можна робити як частину глобулінгу , тобто вашою оболонкою.
man 1 bash
, / екстглоб .
Приклад:
$ shopt -s extglob $ echo зображення / * images / 004.bmp images / 033.jpg images / 1276338351183.jpg images / 2252.png $ echo images /! (*. jpg) images / 004.bmp images / 2252.png
Тож ви просто покладете візерунок всередину !()
, і це заперечує відповідність. Шаблон може бути довільним складним, починаючи з перерахування окремих шляхів (як Ванваріл показує в іншій відповіді): !(filename1|path2|etc3)
до регекс-подібних речей із зірками та класами персонажів. Детальні відомості див. На сторінці сторінки.
man 1 zshexpn
, / генерація імені файлів .
Можна робити setopt KSH_GLOB
і використовувати шаблони, схожі на bash. Або,
% setopt EXTENDED_GLOB % ехо-зображень / * images / 004.bmp images / 033.jpg images / 1276338351183.jpg images / 2252.png % echo images / * ~ * .jpg images / 004.bmp images / 2252.png
Так x~y
відповідає візерунок x
, але виключає візерунок y
. Ще раз, для отримання детальної інформації див. Сторінку.
Риби оболонка має багато красивіше відповідь на цей питання :
🐟 cp (рядок рядків -v '* .excluded.names' - srcdir / *) destdir
Наберіть cp *
, натисніть CtrlX*і просто подивіться, що станеться. це не шкідливо, обіцяю
zsh
хоча.
setopt -u extglob
.
Навіщо використовувати, rsync
коли ви можете:
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
Це передбачає, що структура цільового каталогу буде такою ж, як і джерела.
-path
аргумент, щоб перевірити ієрархії контурів, а не -інам
find . -type f -not -path '*/not-from-here/*' -exec cp '{}' '/dest/{}' \;
rsync
? Тому що він може бути відсутнім у системі! поки find
, cp
завжди на своїх місцях. Або ви з хлопців, які встановили 2 штуки речі, щоб робити прості речі?
cp -r `ls -A | grep -v "c"` $HOME/
# $1 = source path # $2 = destination path # $3 = filter copy_from_source_to_destination_except_filter() { cp -r $(ls -A $1 | grep -v -w $3 | awk -v path=$1 '{printf "%s/%s ", path, $1}') $2 }
Найпростіший спосіб я знайшов, куди ви можете скопіювати всі файли, крім файлів і папок, просто додавши їхні імена в круглі дужки:
shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/
-bash: !: event not found
Розширюючи коментар mvds , це працює для мене
cd dotfiles
tar -c --exclude .git --exclude README . | tar -x -C ~/dotfiles2
Це відносно вихідного каталогу.
Це не дозволить source/.git
скопіювати каталог .
rsync -r --exclude '.git' source target
rsync
rsync -r --verbose --exclude 'exclude_pattern' ./* /to/where/
і спершу спробуйте -n, щоб побачити, що буде скопійовано
Я припускаю, що ви використовуєте bash або dash. Це працювало б?
shopt -s extglob # sets extended pattern matching options in the bash shell
cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination
Робити ls за винятком файлів, які ви не хочете, і використовувати це як перший аргумент для cp
ls
і просто зробити cp !(file1|file1) dest
.
cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
rsync
насправді досить складний. доведеться робити кілька тестів, щоб він працював.
Припустимо, ви хочете скопіювати /var/www/html
в /var/www/dev
але необхідності виключити /var/www/html/site/video/
каталог , можливо , з - за його розміру. Командою було б:
rsync -av --exclude 'sites/video' /var/www/html/ /var/www/dev
Деякі застереження :
/
у джерелі потрібен, інакше він також скопіює каталог джерела, а не його вміст і стане /var/www/dev/html/xxxx
, що, можливо, не є тим, що потрібно.--exclude
Шлях по відношенню до джерела безпосередньо. Навіть якщо ви покладете повний абсолютний шлях, це не вийде.
-v
є для багатослівного, -a
для режиму архіву, що означає, що ви хочете рекурсії і хочете зберегти майже все.
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir
Редагувати: також забув виключити цільовий шлях (інакше він буде рекурсивно копіювати).
Це модифікація відповіді Лінуса Кліна. Його відповідь не спрацювала для мене, оскільки це було б. Додано перед файлом шлях, який не подобається cp (шлях буде схожий на source / .destination / file).
Ця команда працювала для мене:
find . -type f -not -path '*/exlude-path/*' -exec cp --parents '{}' '/destination/' \;
команда --parents зберігає структуру каталогу.
Просто перемістіть її тимчасово в приховану директорію (і перейменуйте її після, якщо потрібно).
mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname
cp
як стандартна оболонка POSIX sh
.
Для читання результатів команди find я використовую цикл "do while". У цьому прикладі я співставляю (а не виключаю) певні шаблони, оскільки є більш обмежена кількість відповідностей шаблонів, яку я хочу, ніж те, що я не хочу. Ви можете змінити логіку за допомогою кнопки -not перед прапорами -iname:
find . -type f -iname "*.flac" -o -print0 -iname "*.mp3" -print0 -o -iname "*.wav" -print0 -o -iname "*.aac" -print0 -o -iname "*.wma" -print0 | while read -d $'\0' file; do cp -ruv "$file" "/media/wd/network_sync/music/$file"; done
Я використовую вище, щоб скопіювати всі файли музичного типу, які на моєму сервері новіші, ніж файли на Western Digital TV Live Hub, які я встановив на / media / wd. Я використовую вище, тому що у мене багато DVD-файлів, mpegs тощо., Які я хочу виключити І тому, що rsync чомусь схоже на копіювання, але після того, як я подивлюсь на wd-пристрій, файлів немає, незважаючи на ні помилки під час rsync з цією командою:
rsync -av --progress --exclude=*.VOB --exclude=*.avi --exclude=*.mkv --exclude=*.ts --exclude=*.mpg --exclude=*.iso --exclude=*ar --exclude=*.vob --exclude=*.BUP --exclude=*.cdi --exclude=*.ISO --exclude=*.shn --exclude=*.MPG --exclude=*.AVI --exclude=*.DAT --exclude=*.img --exclude=*.nrg --exclude=*.cdr --exclude=*.bin --exclude=*.MOV --exclude=*.goutputs* --exclude=*.flv --exclude=*.mov --exclude=*.m2ts --exclude=*.cdg --exclude=*.IFO --exclude=*.asf --exclude=*.ite /media/2TB\ Data/data/music/* /media/wd/network_sync/music/
ls -I "filename1" -I "filename2" | xargs cp -rf -t destdir
Перша частина ls
всіх файлів, але приховані конкретні файли з прапором -I
. Вихід значення ls
використовується як стандартний вхід для другої частини. xargs
побудувати та виконати команду cp -rf -t destdir
зі стандартного вводу. прапор -r
означає каталоги копіювання рекурсивно, -f
означає примусово копіювати файли, які перезаписують файли в destdir
, -t
вкажіть копію каталогу призначення в.
cp -r ls -A | grep -v "Excluded_File_or_folder"
../$target_location -v