Как использовать команду «cp» для исключения определенного каталога? - PullRequest
353 голосов
/ 03 января 2011

Я хочу скопировать все файлы в каталоге, кроме некоторых файлов в определенном подкаталоге.Я заметил, что команда 'cp' не имеет опции --exclude.Итак, как мне этого добиться?

Ответы [ 18 ]

3 голосов
/ 24 июля 2013

Это модификация ответа Линуса Клина. Его ответ не работает для меня, потому что будет. добавляется перед путем к файлу, который не нравится cp (путь будет выглядеть как source / .destination / file).

У меня сработала эта команда:

find . -type f -not -path '*/exlude-path/*' -exec cp --parents '{}' '/destination/' \;

команда --parents сохраняет структуру каталогов.

2 голосов
/ 09 декабря 2017

rsync на самом деле довольно сложно.нужно сделать несколько тестов, чтобы это работало.

Допустим, вы хотите скопировать /var/www/html в /var/www/dev, но необходимо исключить каталог /var/www/html/site/video/, возможно, из-за его размера.Команда будет выглядеть следующим образом:

rsync -av --exclude 'sites/video' /var/www/html/ /var/www/dev

Некоторые предостережение :

  1. Последний слеш / в источнике необходимв противном случае он также копирует исходный каталог, а не его содержимое, и становится /var/www/dev/html/xxxx, что, возможно, не то, что вам нужно.
  2. Путь --exclude равен относительно к источнику напрямую.Даже если вы поставите полный абсолютный путь, он не будет работать.

  3. -v для многословия, -a для режима архива, что означает, что вы хотите рекурсию и хотите сохранить почти все.

2 голосов
/ 07 июня 2013

Просто переместите его временно в скрытый каталог (и переименуйте его после, если хотите).

mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname
2 голосов
/ 25 марта 2012
mv tobecopied/tobeexcluded .
cp -r tobecopied dest/
mv tobeexcluded tobecopied/
1 голос
/ 07 мая 2014

Я использую цикл do while, чтобы прочитать вывод команды find. В этом примере я сопоставляю (а не исключаю) определенные шаблоны, так как есть более ограниченное число сопоставлений с образцами, которые я хочу, чем те, которые я не хочу. Вы можете изменить логику с -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

Я использую вышеупомянутое, чтобы скопировать все файлы музыкального типа, которые новее на моем сервере, чем файлы на Live Digital Hub Western Digital, которые я смонтировал в / 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/
1 голос
/ 03 января 2011
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir

Редактировать: забыл исключить целевой путь (иначе он рекурсивно копировал).

1 голос
/ 03 января 2011

Одним из способов будет использование find -0 с -prune для поиска всех файлов и каталогов, которые вы хотите переместить, затем используйте xargs -0 для копирования каждого из них.

0 голосов
/ 22 марта 2019
ls -I "filename1" -I "filename2" | xargs cp -rf -t destdir 

Первая часть ls все файлы, кроме скрытых определенных файлов с флагом -I.Выход ls используется в качестве стандартного ввода для второй части.xargs построить и выполнить команду cp -rf -t destdir из стандартного ввода.флаг -r означает рекурсивное копирование каталогов, -f означает принудительное копирование файлов, что приведет к перезаписи файлов в destdir, -t, в которые будет указана папка назначения.

...