У меня есть очень простая строка в 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.