У меня есть очень простая строка в bash-скрипте, которая успешно выполняется (т.е. создает_data.tar
файл), за исключением того, что она не исключает подкаталоги, которые, как ей говорят, исключают через --exclude
опцию:
/bin/tar -cf /home/_data.tar --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*' /data
Вместо этого он создает _data.tar
файл, который содержит все в каталоге / data, включая файлы в подкаталогах, которые я хотел исключить.
Есть идеи почему? и как это исправить?
Обновление Я реализовал свои наблюдения на основе ссылки, приведенной в первом ответе ниже (каталог верхнего уровня сначала, без пробела после последнего исключения):
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*'
Но это не помогло. Все «исключенные» подкаталоги присутствуют в результирующем _data.tar
файле.
Это озадачивает. Является ли это ошибкой в текущем tar (GNU tar 1.23, на CentOS 6.2, Linux 2.6.32) или «чрезвычайной чувствительностью» tar к пробелам и другим простым опущенным опечаткам, я считаю это ошибкой. Сейчас.
Это ужасно : я попробовал идею, предложенную ниже (без трейлинга /*
), и она все еще не работает в производственном скрипте:
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1' --exclude='/data/sub2' --exclude='/data/sub3' --exclude='/data/sub4'
Я не вижу никакой разницы между тем, что я пробовал, и тем, что пытался @Richard Perrin, за исключением кавычек и двух пробелов вместо 1. Я собираюсь попробовать это (нужно дождаться запуска ночного скрипта в качестве резервного каталога) вверх огромен) и доложить
/bin/tar -cf /home/_data.tar /data --exclude=/data/sub1 --exclude=/data/sub2 --exclude=/data/sub3 --exclude=/data/sub4
Я начинаю думать, что все эти tar --exclude
чувства - не смола, а что-то в моем окружении, но что тогда это может быть?
Это сработало! Последний вариант (без одинарных кавычек и одного пробела вместо двойного пробела --exclude
) протестировал работу. Странно, но принимать.
Невероятно! Оказывается, что более старая версия tar
(1.15.1) будет исключена, только если каталог верхнего уровня является последним в командной строке. Это полная противоположность тому, как требует версия 1.23. FYI.
--exclude b
(пробел вместо знака равенства) против--exclude=b
. Это имеет какое-то значение? (не должен ИМХО)--exclude=
на одной строке. Так что разница должна быть идиотской,/*
которую я добавил в каждый подкаталог. Я проверю это сегодня вечером в производственном сценарии и сообщу. Еще +1.Возможно, ваша версия
tar
требует, чтобы--exclude
опции были помещены в началеtar
команды.Смотрите: https://stackoverflow.com/q/984204
Смотрите: http://mandrivausers.org/index.php?/topic/8585-multiple-exclude-in-tar/
Альтернатива:
Еще одна
tar
подсказка команды отсюда :источник
--exclude=mydir/*
тогда, он не работает (используяtar --exclude=maindir/mydir/* -cjf archive.tar2.bz2 maindir/*
).tar --version
); Предположительно, Debian будет поставляться с различными версиями tar на протяжении многих лет.--exclude
раньше-czf
.Для исключения нескольких файлов попробуйте
Это сэкономит некоторый код и головную боль. Это глобальное решение для всех видов программ / опций. Если вы также хотите включить родительский каталог в ваш выбор (в данном случае данные), вы должны добавить запятую. Например:
источник
mv /very/very/very/very/long/path/to/a/file{,.bak}
Эта ссылка может быть полезной. http://answers.google.com/answers/threadview/id/739467.html
Два немедленных различия между нерабочей линией и некоторыми подсказками в ссылке:
--exclude
.источник
-MAK
привлек мое внимание, и до сих пор я смог обнаружить следующие различия между моей нерабочей строкой и следующим: 1. Все исключения идут после каталога верхнего уровня. 2. Не может быть никаких пробелов после последнего--exclude
. Я проверю эти идеи и сообщу. +1 сейчас.Обходной путь может состоять в том, чтобы использовать комбинацию
find ... -prune
иtar
исключать указанные каталоги.В Mac OS X
--exclude
опция GNU,tar
похоже, работает так, как должна.В следующем тестовом примере каталоги
/private/var/log/asl
и/private/var/log/DiagnosticMessages
должны быть исключены из сжатого архива/private/var/log
каталога.источник
Возможно, вы можете попробовать команду с другой опцией:
И проверьте, работает ли он так, как задумано.
источник
Я использую Mac и обнаружил, что исключение не работает, если папка верхнего уровня не является последним аргументом
пример рабочей команды:
FYI:
источник
В моем случае это не исключало по другой причине.
Полный путь против относительного пути.
И исключение, и каталог должны использовать один и тот же формат пути (то есть как полный путь, так и оба относительных пути).
Пример:
Это не будет работать, потому что исключение использует полный путь, где в качестве цели используется относительный путь
Это работает, потому что оба используют полный путь
Это работает, потому что оба используют относительный путь
источник
Вместо
--exclude=
использования-X
с текстовым файлом:http://www.cyberciti.biz/faq/exclude-certain-files-when-creating-a-tarball-using-tar-command/
источник
Дополнительные примечания к превосходному ответу Р. Перрина :
Предположим, вы не хотите архивировать абсолютные, но относительные пути, например, «данные» вместо «/ tmp / data». Чтобы исключить абсолютные пути, ваши аргументы tar будут отличаться в зависимости от реализации tar (gnu tar против bsd tar), которую вы используете:
источник
Только что обнаружен на tar (GNU tar) 1.29
Этот вызов не исключает из архивных файлов, указанных с --exclude-from:
Этот звонок работает правильно:
Порядок параметров важен!
источник
Я перепробовал все виды комбинаций, включая некоторые из перечисленных ответов, и просто не мог получить их, чтобы исключить перечисленные файлы.
Итак, сыт по горло погоней за ответом на то, что должно было быть пятиминутной работой, я сделал наоборот: создал архив папок, которые я хотел включить.
Я сделал это, создав архив и добавив в него :
Несколько заметок:
tar
(а не заархивированный tar.tgz
/.tar.gz
) архив - вы можете сжать его позже, используяgzip mybackup.tar
tar tvf mybackup.tar
.источник