tar - исключает, не исключает. Почему?

--relocate отметьте обновляет Вашу рабочую копию, если URL раньше достигал Ваших существующих изменений репозитория. Нет хорошего пути к SVN для переключения рабочей копии на новый репозиторий, потому что даже при том, что это могло бы содержать те же файлы, любое количество других вещей могло бы отличаться - история, количество checkins, содержание файлов, и так далее, и SVN не разработан для составления тех видов различий.

Вы задали свой вопрос просто с клиентской точки зрения, но было бы полезно иметь большее изображение того, что Вы пытаетесь сделать. Например, Вы пытаетесь переместить свой собственный репозиторий в новый сервер? Если так, какой метод Вы использовали и могли бы там быть лучшим? Или Вы использовали репозиторий, управляемый кем-то еще, и они переместили его? Существует вся история старого репозитория в новом репозитории? Существует ли причина, Вы/они не можете скопировать файлы базы данных SVN в новый сервер вместо того, чтобы создать совершенно новый репозиторий?

Существует способ вызвать то, что Вы хотите - а именно, удаляете свои .svn каталоги из Вашей рабочей копии (сделайте резервное копирование сначала!), проверьте новую копию с нового сервера и переместите все .svn каталоги от новой копии до соответствующих мест в Вашей рабочей копии. Но только сделайте это, после того как Вы рассмотрели большее изображение.

74
08.03.2012, 17:19
13 ответов

Если Вы хотите исключить весь каталог, Ваш шаблон должен соответствовать тому каталогу, не файлам в нем. Использовать --exclude=/data/sub1 вместо --exclude='/data/sub1/*'

Будьте осторожны с заключением в кавычки шаблонов для защиты их от расширения оболочки.

Посмотрите этот пример с проблемой в заключительном вызове:

$ for i in 0 1 2; do mkdir -p /tmp/data/sub$i; echo foo > /tmp/data/sub$i/foo; done
$ find /tmp/data
/tmp/data
/tmp/data/sub2
/tmp/data/sub2/foo
/tmp/data/sub0
/tmp/data/sub0/foo
/tmp/data/sub1
/tmp/data/sub1/foo
$ tar -zvcf /tmp/_data.tar /tmp/data --exclude='/tmp/data/sub[1-2]'
tar: Removing leading `/' from member names
/tmp/data/
/tmp/data/sub0/
/tmp/data/sub0/foo
$ tar -zvcf /tmp/_data.tar /tmp/data --exclude=/tmp/data/sub[1-2]
tar: Removing leading `/' from member names
/tmp/data/
/tmp/data/sub0/
/tmp/data/sub0/foo
$ echo tar -zvcf /tmp/_data.tar /tmp/data --exclude=/tmp/data/sub[1-2]
tar -zvcf /tmp/_data.tar /tmp/data --exclude=/tmp/data/sub[1-2]
$ tar -zvcf /tmp/_data.tar /tmp/data --exclude /tmp/data/sub[1-2]
tar: Removing leading `/' from member names
/tmp/data/
/tmp/data/sub2/
/tmp/data/sub2/foo
/tmp/data/sub0/
/tmp/data/sub0/foo
/tmp/data/sub2/
tar: Removing leading `/' from hard link targets
/tmp/data/sub2/foo
$ echo tar -zvcf /tmp/_data.tar /tmp/data --exclude /tmp/data/sub[1-2]
tar -zvcf /tmp/_data.tar /tmp/data --exclude /tmp/data/sub1 /tmp/data/sub2
53
27.01.2020, 19:31
  • 1
    Спасибо за очень сфокусированный и четкий ответ. Относительно Вашей 1-й точки я пытался следовать советам в этом потоке LQ. Я не уверен, что я пропустил, но теперь, когда я считал Вашу 2-ю точку, она может очень хорошо абсолют по сравнению с проблемой относительного пути. Я попробую это и сообщу. +1 на данный момент. –  ateiob 29.02.2012, 16:15
  • 2
    Другая вещь, которую я заметил, --exclude b (пространство вместо знака "равно") по сравнению с. --exclude=b. Это имеет какое-либо значение? (не был должен, по моему скромному мнению), –  ateiob 29.02.2012, 16:26
  • 3
    знак "равно", может быть важен избежать расширения оболочки неупомянутых шаблонов. Если у Вас есть пространство вместо этого, то неупомянутый шаблон может быть расширен оболочкой в сингл - исключают аргумент, и остающиеся расширения дают как файлы для добавления к файлу tar. Ваши примеры, прежде всего, имеют '=' - если сценарий не делает и пропускает одинарные кавычки, то это может источник Вашей проблемы. –  R Perrin 29.02.2012, 19:26
  • 4
    OK. Я протестировал Ваш пример на своем поле, и это работает, даже с несколькими --exclude= на той же строке. Таким образом, различием должно быть идиотичное /* то, что я добавил к каждому подкаталогу. Я протестирую это сегодня вечером в производственном сценарии и сообщу. Еще +1. –  ateiob 29.02.2012, 23:43
  • 5
    Для меня, ответ от @carlo был определенной проблемой - глупый tar не может взять - исключают как последняя опция на командной строке - очевидно, порождение большого количества головных болей. Спасибо все. –  moodboom 29.11.2016, 16:40

Может случиться так что Ваша версия tar требует что --exclude опции должны быть помещены в начале tar команда.

См.: https://stackoverflow.com/q/984204

tar --exclude='./folder' --exclude='./upload/folder2' \
    -zcvf /backup/filename.tgz .

См.: http://mandrivausers.org/index.php?/topic/8585-multiple-exclude-in-tar/

tar --exclude=<first> --exclude=<second> -cjf backupfile.bz2 /home/*

Альтернатива:

EXCLD='first second third'
tar -X <(for i in ${EXCLD}; do echo $i; done) -cjf backupfile.bz2 /home/*

Еще один tar подсказка по команде отсюда:

tar cvfz myproject.tgz --exclude='path/dir_to_exclude1' \
                       --exclude='path/dir_to_exclude2' myproject
38
27.01.2020, 19:31
  • 1
    Посмотрите мое обновление выше. Последнее изменение попробовали (никакие кавычки, одиночный пробел) работы. Я понятия не имею почему. +1 для хорошо ответа мысли + ссылки. –  ateiob 04.03.2012, 05:51
  • 2
    К вашему сведению, под debian, Если я не делаю точный фильтр, как --exclude=mydir/* затем это не работает (использование tar --exclude=maindir/mydir/* -cjf archive.tar2.bz2 maindir/*). –  Olivier Pons 06.02.2018, 12:31
  • 3
    @OlivierPons, а не "под debian", или возможно с ним, помещают версию tar (tar --version); debian будет, по-видимому, поставляться со многими различными версиями tar в течение лет. –  msouth 09.02.2018, 06:43

Эта ссылка могла бы быть полезной. http://answers.google.com/answers/threadview/id/739467.html

Два непосредственных различия между нерабочей строкой и некоторыми подсказками в ссылке:

  1. Все исключает, прибывают после каталога верхнего уровня.
  2. Не может иметь НИКАКИХ пробелов после последнего --exclude.
5
27.01.2020, 19:31
  • 1
    Спасибо. Ответ -MAK привлеченный мое внимание и до сих пор я смог определить следующие различия между своей нерабочей строкой и следующим: 1. Все исключает, прибывают после каталога верхнего уровня. 2. Не может иметь НИКАКИХ пробелов после последнего --exclude. Я протестирую это понимание и сообщу. +1 на данный момент. –  ateiob 27.02.2012, 18:20
  • 2
    @ateiob, Если Вы понимаете это, можно ли отправить ответ здесь или отредактировать ли этого? Мы обычно предпочитаем не иметь ответов, которые являются просто ссылками в другом месте –  Michael Mrozek♦ 27.02.2012, 18:22
  • 3
    @Michael Mrozek Абсолютно. Это точно, что я записал в своем комментарии. :) –  ateiob 27.02.2012, 18:24

Обходное решение может быть должно использовать комбинацию find ... -prune и tar исключить указанные каталоги.

На Mac OS X --exclude опция GNU tar кажется, работает, как это должно все же.

В следующем тестовом сценарии каталоги /private/var/log/asl и /private/var/log/DiagnosticMessages должны быть исключены из сжатого архива /private/var/log каталог.

# all successfully tested in Bash shell on Mac OS X (using gnutar and gfind)

# sudo port install findutils  # for gfind from MacPorts

sudo gnutar -czf ~/Desktop/varlog.tar.gz /private/var/log --exclude "/private/var/log/asl" --exclude "/private/var/log/DiagnosticMessages"

sudo gnutar -czf ~/Desktop/varlog.tar.gz  --exclude "/private/var/log/asl" --exclude "/private/var/log/DiagnosticMessages" /private/var/log

set -f # disable file name globbing
sudo gnutar -czf ~/Desktop/varlog.tar.gz  --exclude "/private/var/log/asl" --exclude "/private/var/log/Diagnostic*" /private/var/log

# combining GNU find and tar (on Mac OS X)

sudo gfind /private/var/log -xdev -type d \( -name "asl" -o -name "DiagnosticMessages" \) -prune -o -print0 | 
   sudo gnutar --null --no-recursion -czf ~/Desktop/varlog.tar.gz --files-from -

# exclude even more dirs
sudo gfind /private/var/log -xdev -type d \( -name "asl" -o -name "[Dacfks]*" \) -prune -o -print0 | 
    sudo gnutar --null --no-recursion -czf ~/Desktop/varlog.tar.gz --files-from -


# testing the compressed archive

gnutar -C ~/Desktop -xzf ~/Desktop/varlog.tar.gz

sudo gfind /private/var/log ~/Desktop/private \( -iname DiagnosticMessages -or -iname asl \)

sudo rm -rf ~/Desktop/varlog.tar.gz ~/Desktop/private
3
27.01.2020, 19:31
  • 1
    Спасибо +1 для предложения. В этой точке я все еще пытаюсь понять, почему хорошо зарегистрированный (и сформировавшийся) функция не работает в моем скрипте, ночью запущенном кроном. –  ateiob 02.03.2012, 16:52

Возможно, можно попробовать команду другой опцией:

--wildcards

И проверьте, работает ли это, как предназначено.

3
27.01.2020, 19:31
  • 1
    Посмотрите мое обновление выше. Последнее изменение попробовали (никакие кавычки, одиночный пробел) работы. Я понятия не имею почему. +1 для идеи. –  ateiob 04.03.2012, 05:53

Поскольку, исключая несколько файлов, попробовать

--exclude=/data/{sub1,sub2,sub3,sub4}

Это сохранит некоторый код и головную боль. Это - глобальное решение для всего вида программ / опции. Если Вы также хотите включать родительский каталог в свой выбор (в этих данных случая), необходимо включать запаздывающую запятую. Например:

umount /data/{sub1,sub2,}
8
27.01.2020, 19:31
  • 1
    я люблю кюри. Я нахожу, что много людей не знает о них, даже с годами опыта Unix. mv /very/very/very/very/long/path/to/a/file{,.bak} –  msouth 09.02.2018, 06:45

] Я использую Mac и обнаружил, что исключения не работают, если папка верхнего уровня не является последним аргументом

пример рабочей команды:

tar czvf tar.tgz --exclude='Music' dir

FYI:

$: tar --version
bsdtar 2.8.3 - libarchive 2.8.3
5
27.01.2020, 19:31

Вместо --exclude= используйте -X с текстовым файлом:

http://www.cyberciti.biz/faq/exclude-certain-files-when-creating-a-tarball-using-tar-command/

1
27.01.2020, 19:31

В моем случае не исключил по другой причине.

Полный путь против относительного пути.

И исключение, и каталог должны использовать один и тот же формат пути (то есть полный путь или оба относительных пути)

Пример:

tar -cvf ctms-db-sync.tar --exclude='/home/mine/tmp/ctms-db-sync/sql' ctms-db-sync

Это не сработает, потому что исключение использует полный путь, тогда как цель использует относительный путь

tar -cvf ctms-db-sync.tar --exclude='/home/mine/tmp/ctms-db-sync/sql' /home/mine/tmp/ctms-db-sync

Это работает, потому что оба используют полный путь

tar -cvf ctms-db-sync.tar --exclude='ctms-db-sync/sql' ctms-db-sync

Это работает, потому что оба используют относительный путь

3
27.01.2020, 19:31

Дополнительные примечания к Отличный ответ Р. Перрина :

Предположим, вы не хотите архивировать абсолютные, а относительные пути, например 'data' вместо '/tmp/data'. Чтобы исключить абсолютные пути, ваши аргументы tar будут различаться в зависимости от используемой реализации tar (gnu tar или bsd tar):

$ for i in 0 1 2; do
    for j in 0 1 2; do 
      mkdir -p /tmp/data/sub$i/sub$j
      echo foo > /tmp/data/sub$i/sub$j/foo
    done
  done

$ find /tmp/data/
/tmp/data/
/tmp/data/sub2
/tmp/data/sub2/sub2
/tmp/data/sub2/sub2/foo
/tmp/data/sub2/sub1
/tmp/data/sub2/sub1/foo
/tmp/data/sub2/sub0
/tmp/data/sub2/sub0/foo
/tmp/data/sub1
/tmp/data/sub1/sub2
/tmp/data/sub1/sub2/foo
/tmp/data/sub1/sub1
/tmp/data/sub1/sub1/foo
/tmp/data/sub1/sub0
/tmp/data/sub1/sub0/foo
/tmp/data/sub0
/tmp/data/sub0/sub2
/tmp/data/sub0/sub2/foo
/tmp/data/sub0/sub1
/tmp/data/sub0/sub1/foo
/tmp/data/sub0/sub0
/tmp/data/sub0/sub0/foo

$ cd /tmp/data; tar -zvcf /tmp/_data.tar --exclude './sub[1-2]'
./
./sub0/
./sub0/sub2/
./sub0/sub2/foo
./sub0/sub1/
./sub0/sub1/foo
./sub0/sub0/
./sub0/sub0/foo

# ATTENTION: bsdtar's behaviour differs from traditional tar (without a leading '^')!
$ cd /tmp/data; bsdtar -zvcf /tmp/_data.tar --exclude './sub[1-2]' .
a .
a ./sub0
a ./sub0/sub0
a ./sub0/sub0/foo

# FIX: Use a regex by adding a leading '^' will cause bsdtar to match only parent files and folders.
$ cd /tmp/data; bsdtar -zvcf /tmp/_data.tar --exclude '^./sub[1-2]' .
# ALTERNATIVE: bsdtar -C /tmp/data -zvcf /tmp/_data.tar --exclude '^./sub[1-2]' .
a .
a ./sub0
a ./sub0/sub2
a ./sub0/sub1
a ./sub0/sub0
a ./sub0/sub0/foo
a ./sub0/sub1/foo
a ./sub0/sub2/foo
1
27.01.2020, 19:31

Только что обнаружено в tar (GNU tar )1.29

Этот вызов не исключает из архива файлы, указанные с помощью --exclude -from:

/bin/tar --files-from ${datafile} --exclude-from ${excludefile} -jcf ${backupfile}

Этот вызов работает корректно:

/bin/tar --exclude-from ${excludefile} --files-from ${datafile} -jcf ${backupfile}

Порядок параметров важен!

2
27.01.2020, 19:31

Случай успеха:

1 )если указать полный путь для создания резервной копии, при исключении также следует использовать полный путь.

tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz \
    --exclude='/opt/ABC/csv/*' --exclude='/opt/ABC/log/*' /opt/ABC

2 )если указать текущий путь для резервного копирования, в исключении также следует использовать только текущий путь.

tar -zcvf backup_27032020.tar.gz \
    --exclude='ABC/csv/*' --exclude='ABC/log/*' ABC

Случай отказа:

1 )если указать каталог currentpath для резервного копирования и полный путь для игнорирования, то не будет работать

tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz \
    --exclude='/opt/ABC/csv/*' --exclude='/opt/ABC/log/*' ABC

Примечание. :Упоминание об исключении каталога резервного копирования до/после допустимо.

-1
26.03.2020, 20:49

Семейство excludeпараметров применяется к внутренним относительным именам файлов в архиве. Указанный вами абсолютный путь никогда не будет существовать в tar-архиве, поскольку он имеет только относительные пути от предоставленного корня.

0
08.06.2021, 16:47

Теги

Похожие вопросы