Команда оболочки для каталога tar, исключая определенные файлы / папки

812

Существует ли простая команда / скрипт оболочки, которая поддерживает исключение определенных файлов / папок из архива?

У меня есть каталог, который должен быть заархивирован с подкаталогом, содержащим несколько очень больших файлов, которые мне не нужно резервировать.

Не совсем решения:

Команда tar --exclude=PATTERNсоответствует заданному шаблону и исключает эти файлы, но мне нужно игнорировать определенные файлы и папки (полный путь к файлу), в противном случае допустимые файлы могут быть исключены.

Я также мог бы использовать команду find, чтобы создать список файлов и исключить те, которые я не хочу архивировать, и передать список в tar, но это работает только с небольшим количеством файлов. У меня десятки тысяч.

Я начинаю думать, что единственное решение - создать файл со списком исключаемых файлов / папок, затем использовать rsync --exclude-from=fileдля копирования всех файлов в каталог tmp, а затем использовать tar для архивирования этого каталога.

Кто-нибудь может придумать лучшее / более эффективное решение?

РЕДАКТИРОВАТЬ: решение Чарльза Ма работает хорошо. Главное, что --exclude='./folder' ДОЛЖНО быть в начале команды tar. Полная команда (сначала cd, поэтому резервное копирование относится к этому каталогу):

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
глубокий колодец
источник
121
Еще одна вещь, поразившая меня, может стоить заметить: конечные слэши в конце исключенных папок заставят tar вообще не исключать эти папки.
Рехыт
7
@Rekhyt спасибо, я смотрел на команду в течение 15 минут ... затем 30
earcam
9
Кажется, позиция --exclude зависит от версии tar. Для tar 1.23, --exclude должен идти после основных команд.
Джоэл Г Мэтью
2
Не забывайте «» (кавычки).
Meetai.com
3
--excludeне обязательно должен быть первым, но он должен находиться где-то перед исходным каталогом (протестировано с tar 1.29 на Cygwin).
Вортварт

Ответы:

1038

Вы можете иметь несколько опций исключения для tar, так

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

и т. д. будет работать. Убедитесь, что поставили --exclude перед отправителем и пунктом назначения.

Чарльз Ма
источник
78
Этот ответ выглядит так: --exclude стоит первым ... tar cvfpz ../stuff.tgz --exclude = 'node_modules' --exclude = '. Git'.
Джеймс О'Брайен
13
Например, если вы пытаетесь сделать резервную копию вашей папки проекта WordPress, исключая папку для загрузки, вы можете использовать эту команду: tar -cvf wordpress_backup.tar wordpress --exclude = wp-content / uploads
shasi kanth
12
Я придумал следующую команду: tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz . обратите внимание, что -fфлаг должен предшествовать tar-файлу, смотрите: superuser.com/a/559341/415047
Альфред Без
21
«/» В конце каталога исключений приведет к сбою. Я предполагаю, что tar считает окончание / частью исключаемого имени каталога. ПЛОХО: --exclude = mydir / GOOD: --exclude = mydir
Иосия
4
> Обязательно ставьте --exclude перед исходным и целевым элементами. ИЛИ используйте абсолютный путь для исключения: tar -cvpzf backups / target.tar.gz --exclude = '/ home / username / backups' / home / username
NightKnight на Cloudinsidr.com
131

Вы можете исключить каталоги с помощью --excludetar.

Если вы хотите заархивировать все, кроме /usrвы можете использовать:

tar -zcvf /all.tgz / --exclude=/usr

В вашем случае возможно что-то вроде

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir
Йохан Содерберг
источник
17
Чтобы уточнить, вы можете использовать полный путь для --exclude.
Йохан Содерберг
2
в некоторых случаях требуется, чтобы --exclude предшествовал файлам / папкам для архивации
kronuus
68

Возможные варианты исключения файлов / каталогов из резервной копии с помощью tar:

Исключить файлы, используя несколько шаблонов

tar -czf backup.tar.gz --exclude=PATTERN1 --exclude=PATTERN2 ... /path/to/backup

Исключить файлы, используя исключаемый файл, заполненный списком шаблонов

tar -czf backup.tar.gz -X /path/to/exclude.txt /path/to/backup

Исключите файлы с помощью тегов, поместив файл тегов в любой каталог, который следует пропустить

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup
Стивен Донекер
источник
3
Упорядочение параметров, кажется, имеет значение, и эта форма работает для меня.
Cstamas
1
Я тоже. Для tar (GNU tar) 1.28 в Ubuntu 16.04 работал только этот конкретный порядок параметров.
alvaroreig
43

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

если у вас есть следующая структура

/home/ftp/mysite/

со следующими файлами / папками

/home/ftp/mysite/file1
/home/ftp/mysite/file2
/home/ftp/mysite/file3
/home/ftp/mysite/folder1
/home/ftp/mysite/folder2
/home/ftp/mysite/folder3

Итак, вы хотите создать tar-файл, который содержит все внутри / home / ftp / mysite (чтобы переместить сайт на новый сервер), но file3это просто мусор, и все в нем folder3также не нужно, поэтому мы пропустим эти два.

мы используем формат

tar -czvf <name of tar file> <what to tar> <any excludes>

где c = create, z = zip и v = verbose (вы можете видеть файлы по мере их ввода, полезно, чтобы убедиться, что ни один из исключаемых вами файлов не добавляется). и f = файл.

Итак, моя команда будет выглядеть так

cd /home/ftp/
tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'

обратите внимание, что исключенные файлы / папки относятся к корню вашего tar (здесь я пробовал полный путь относительно /, но я не могу заставить это работать).

надеюсь, это поможет кому-то (и мне в следующий раз, когда я погуглю)

Сверре
источник
6
Этот ответ определенно помог мне! Я понял, что моя команда выглядела примерно так tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3', и это ничего не исключало.
Аниш Рамасвами
2
Ваш образец был очень похож на то, с чем я столкнулся! Спасибо!
Qorbani
2
Красиво и понятно спасибо. Для меня проблема заключалась в том, что другие ответы включают абсолютные относительные пути. Но все, что вам нужно сделать, это добавить имя папки, которую вы хотите исключить.
Юбер
2
Это гораздо более четкий ответ. Из-за примера я смог заставить его работать, так как сначала путались пути. Огромное спасибо!
Фагиани
2
это сработало! Пожалуйста, не забудьте добавить косую черту в исключение. Например, в то время как «file3» или «file3 / subfolder» работает, «file3 /» и «file3 / subfolder /» не работают!
lucaferrario
24

Вы можете использовать стандартную «муравьиную нотацию» для исключения относительных каталогов.
Это работает для меня и исключает любые каталоги .git или node_module:

tar -cvf myFile.tar --exclude=**/.git/* --exclude=**/node_modules/*  -T /data/txt/myInputFile.txt 2> /data/txt/myTarLogFile.txt

myInputFile.txt содержит:

/ dev2 / java
/ dev2 / javascript

Эрик Мэнли
источник
4
Я считаю, что это требует, чтобы переменная опции оболочки Bash globstarбыла включена. Проверьте с shopt -s globstar. Я думаю , что это от по умолчанию на большинстве Unix на основе ОС. Из руководства Bash: « globstar: если установлено, шаблон, **используемый в контексте расширения имени файла, будет соответствовать всем файлам и нулю или более каталогов и подкаталогов. Если за шаблоном следует
символ
15

Я испытал это, по крайней мере, с версией Cygwin tar, которую я использую ("CYGWIN_NT-5.1 1.7.17 (0.262 / 5/3) 2012-10-19 14:39 i686 Cygwin" в Windows XP Home Edition SP3 machine), порядок опций важен.

Пока эта конструкция у меня работала

tar cfvz target.tgz --exclude='<dir1>' --exclude='<dir2>' target_dir

тот не работал

tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir

Это пока tar --helpраскрывает следующее:

tar [OPTION...] [FILE]

Итак, вторая команда также должна работать, но, похоже, это не так ...

Лучшие ргдс,

GeertVc
источник
5
Просто хочу добавить к вышесказанному, что важно, чтобы каталог, который нужно исключить, НЕ содержал окончательной обратной косой черты. Таким образом, --exclude = '/ path / to / exclude / dir' - ПРАВИЛЬНО , --exclude = '/ path / to / exclude / dir /' - НЕПРАВИЛЬНО .
GeertVc
17
это потому, что целевой архив target.tgz является аргументом переключателя f, которому он должен следовать
Valentino
14

Этот шаблон исключения обрабатывает суффикс имени файла, такой как png или mp3, а также имена каталогов, такие как .git и node_modules

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}
Скотт Стенсленд
источник
спасибо - вот что я искал :)
Александр Бр.
11

Для тех, у кого есть проблемы с этим, некоторые версии tar будут работать только без './' в значении exclude.

Tar --version

tar (GNU tar) 1.27.1

Синтаксис команды, которая работает:

tar -czvf ../allfiles-butsome.tar.gz * --exclude=acme/foo

Это не будет работать:

$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=./acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='./acme/foo'
$ tar --exclude=./acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='./acme/foo' -czvf ../allfiles-butsome.tar.gz *
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=/full/path/acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='/full/path/acme/foo'
$ tar --exclude=/full/path/acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='/full/path/acme/foo' -czvf ../allfiles-butsome.tar.gz *
Дж. Лоусон
источник
10

Я нашел это где-то еще, так что я не буду брать кредит, но это работало лучше, чем любое из решений выше для моих проблем, связанных с Mac (даже если это закрыто):

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
обкрадывать
источник
2
Спасибо за этот ответ, tar на darwin определенно имеет другой синтаксис, и это сводило меня с ума, почему «--exclude = blah» в других ответах не работало. Это отлично работает на Mac.
Майкл
1
Не забывайте COPYFILE_DISABLE=1при использовании tar, в противном случае вы можете получить ._ файлы в своем архиве
Benoit Duffez
Спасибо, что включили ваш ответ. Всегда приятно добавить ссылку на источник, где вы нашли ответ. Бонус: если источник был из другого поста stackoverflow или stackexchange, вы получаете дополнительную карму (либо очки, либо значки - я не помню, какие именно). В любом случае, они получают улыбку, и все выигрывают. Нет недостатков :-) Это также помогает людям, если они хотят найти дополнительную информацию. Иногда люди будут голосовать только потому, что вы включили ссылку на источник. Наконец, если вы поделитесь конкретной проблемой, которая решается, или почему это было лучшим решением, это может помочь кому-то еще с уникальной проблемой.
SherylHohman
8

Для Mac OSX мне пришлось сделать

tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar

Обратите внимание на -fпосле--exclude=

Jerinaw
источник
6

Я согласен, что флаг --exclude является правильным подходом.

$ tar --exclude='./folder_or_file' --exclude='file_pattern' --exclude='fileA'

Слово с предупреждением о побочном эффекте, который я не нашел сразу очевидным: исключение «fileA» в этом примере будет искать «fileA» РЕКУРСИВНО !

Пример: каталог с одним подкаталогом, содержащий файл с тем же именем (data.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • При использовании --exclude='data.txt'архива не будет содержать ЯВНО data.txt файл. Это может привести к неожиданным результатам при архивировании сторонних библиотек, таких как каталог node_modules.

  • Чтобы избежать этой проблемы, обязательно укажите весь путь, например, --exclude='./dirA/data.txt'

Аарон Вотре
источник
5

Чтобы избежать возможных 'xargs: Argument list too long'ошибок из-за использования find ... | xargs ...при обработке десятков тысяч файлов, вы можете направить вывод findнепосредственно в tarиспользование find ... -print0 | tar --null ....

# archive a given directory, but exclude various files & directories 
# specified by their full file paths
find "$(pwd -P)" -type d \( -path '/path/to/dir1' -or -path '/path/to/dir2' \) -prune \
   -or -not \( -path '/path/to/file1' -or -path '/path/to/file2' \) -print0 | 
   gnutar --null --no-recursion -czf archive.tar.gz --files-from -
   #bsdtar --null -n -czf archive.tar.gz -T -
карло
источник
Вы можете заключить в кавычки строку «exclude», например: «somedir / filesdir / *», тогда оболочка не будет расширять звездочки и другие белые символы.
Znik
xargs -n 1это еще один вариант, чтобы избежать xargs: Argument list too longошибки;)
Tuxdude
5

Прочитав эту ветку, я провел небольшое тестирование на RHEL 5, и вот мои результаты для отслеживания каталога abc:

Это исключит ошибку каталогов и журналов и всех файлов в каталогах:

tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'

Добавление подстановочного знака после исключенного каталога исключит файлы, но сохранит каталоги:

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'
Майк
источник
Во втором примере выше должны быть звездочки после последней косой черты в каждом предложении исключения, но пост не принял их.
Майк
4

Используйте команду find в сочетании с опцией tar append (-r). Таким образом, вы можете добавлять файлы в существующий tar за один шаг, вместо двухпроходного решения (создать список файлов, создать tar).

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
Алекс Б
источник
4

Вы также можете использовать один из параметров --exclude-tag в зависимости от ваших потребностей:

  • --exclude-тег = FILE
  • --exclude-теги все = FILE
  • --exclude-метка-под = ФАЙЛ

Папка с указанным файлом будет исключена.

frommelmak
источник
4

Прочитав все эти хорошие ответы для разных версий и решив проблему для себя, я думаю, что есть очень мелкие детали, которые очень важны и редки для общего использования GNU / Linux , которые недостаточно подчеркнуты и заслуживают большего, чем комментарии.

Поэтому я не буду пытаться ответить на вопрос для каждого случая, а вместо этого попытаюсь зарегистрироваться, где искать, когда что-то не работает.

ЭТО ОЧЕНЬ ВАЖНО ДЛЯ УВЕДОМЛЕНИЯ:

  1. ПОРЯДОК ВАРИАНТОВ ВАРИАНТОВ: это не то же самое, поместите --exclude до, чем после опции файла и каталогов для резервного копирования. По крайней мере, для меня это неожиданно, потому что, по моему опыту, в командах GNU / Linux порядок опций не имеет значения.
  2. В разных версиях tar эти параметры ожидаются в разном порядке: например, ответ @ Andrew указывает на то, что в GNU tar v 1.26 и 1.28 исключения идут последними, тогда как в моем случае, с GNU tar 1.29, это другой путь.
  3. ТРЕЙЛИНГ РЕЗУЛЬТАТОВ имеет значение : по крайней мере, в GNU tar 1.29, это не должно быть .

В моем случае для GNU tar 1.29 на Debian stretch сработала команда

tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar  /dir1/ /home/ /dir3/

Цитаты не имели значения, они работали с ними или без них.

Надеюсь это кому-нибудь пригодится.

user2553863
источник
Спасибо за ваш ответ. Я искал (что казалось очень долгим) решение, и ваш ответ направил меня в правильном направлении. Однако в моем случае (Ubuntu 18.04.3, Tar 1.29) я мог только заставить его работать с добавлением имени папки, а НЕ пути, например: tar --exclude = folder1 --exclude = folder2 -czvf / opt / archieve. TGZ папка
Нитай
2

Вы можете использовать cpio (1) для создания файлов tar. cpio принимает файлы для архивации на stdin, поэтому, если вы уже выяснили команду find, которую хотите использовать для выбора файлов архива, направьте ее в cpio для создания файла tar:

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
CAMH
источник
2

gnu tar v 1.26 - --exclude должен следовать за аргументами файла архива и каталога резервных копий, не должен иметь начальных или конечных слешей и не предпочитает кавычки (одинарные или двойные). Таким образом, по отношению к каталогу PARENT для резервного копирования, это:

tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude

Эндрю
источник
После долгих экспериментов я обнаружил более или менее то же самое с моей командой tar (GNU tar) 1.28.
PicoutputCls
2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

-X указывает файл, который содержит список имен файлов, которые должны быть исключены из резервной копии. Для Instance вы можете указать * ~ в этом файле, чтобы не включать имена файлов, оканчивающиеся на ~ в резервной копии.

Ашвини Гупта
источник
Я думаю, это лучшее решение, так как оно работает даже в тех случаях, когда число исключений велико. Также возможно включить опцию X в пакет опций, поэтому, возможно, самая короткая форма:tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Kai Petzke
0

Лучше всего использовать find с tar через xargs (для обработки большого количества аргументов). Например:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
Джо
источник
4
Это может привести к тому, что tar будет вызываться несколько раз, а также будет многократно упаковывать файлы. Правильно это:find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
Йоргенсен
Я где-то читал, что при использовании xargsследует использовать rопцию tar вместо того, cпотому что, когда на findсамом деле находит множество результатов, xargs будет разбивать эти результаты (основываясь на ограничении локальных аргументов командной строки) на куски и вызывать tar для каждой части. Это приведет к архиву, содержащему последний возвращенный чанк, xargsа не все результаты, найденные findкомандой.
Стефан
0

Возможно избыточный ответ, но так как я нашел его полезным, вот оно:

В то время как корень FreeBSD (то есть использующий csh) я хотел скопировать всю мою корневую файловую систему в / mnt, но без / usr и (очевидно) / mnt. Вот что сработало (я на /):

tar --exclude ./usr --exclude ./mnt --create --file - . (cd /mnt && tar xvd -)

Весь мой смысл в том, что было необходимо (поставив ./ ) указать tar, что исключенные каталоги были скопированы как часть большего каталога.

Мои € 0,02

Джордж
источник
0

Мне не повезло получить tar, чтобы исключить поддиректорию на 5 гигабайт глубиной в несколько уровней. В конце концов, я просто использовал команду unix Zip. Это работало намного легче для меня.

Так что для этого конкретного примера из исходного поста
(tar --exclude = '. / Folder' --exclude = '. / Upload / folder2' -zcvf /backup/filename.tgz.)

Эквивалент будет:

zip -r /backup/filename.zip. -x загрузка / папка / ** \ * загрузка / папка2 / ** \ *

(ПРИМЕЧАНИЕ: вот пост, который я первоначально использовал, который помог мне /superuser/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )

user2792605
источник
3
Осторожно: zipне упаковывает пустые каталоги, но tarделает!
t0r0X
0

Проверьте это

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
RohitPorwal
источник
0

Я хочу иметь свежую переднюю версию (угловая папка) на localhost. Кроме того, папка git в моем случае огромна, и я хочу ее исключить. Мне нужно скачать его с сервера и распаковать, чтобы запустить приложение.

Сожмите угловую папку из / var / lib / tomcat7 / webapps, переместите ее в папку / tmp с именем angular.23.12.19.tar.gz

Команда:

tar --exclude='.git' -zcvf /tmp/angular.23.12.19.tar.gz /var/lib/tomcat7/webapps/angular/
dobrivoje
источник
0

Успешный пример: 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

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

Шридхар Кумар Н
источник
0

Если вы пытаетесь исключить файлы системы контроля версий (VCS), tar уже поддерживает два интересных варианта! :)

  1. Опция: --exclude-vcs

Эта опция не включает файлы и каталоги , используемые следующими системами контроля версий: CVS, RCS, SCCS, SVN, Arch, Bazaar, Mercurial, и Darcs.

Начиная с версии 1.32 исключены следующие файлы:

  • CVS/и все под ним
  • RCS/и все под ним
  • SCCS/и все под ним
  • .git/и все под ним
  • .gitignore
  • .gitmodules
  • .gitattributes
  • .cvsignore
  • .svn/и все под ним
  • .arch-ids/и все под ним
  • {arch}/и все под ним
  • =RELEASE-ID
  • =meta-update
  • =update
  • .bzr
  • .bzrignore
  • .bzrtags
  • .hg
  • .hgignore
  • .hgrags
  • _darcs

    1. Опция: --exclude-vcs-ignores

При архивировании каталогов, которые находятся в какой-либо системе контроля версий (VCS), часто удобно читать шаблоны исключений из файлов игнорирования этой VCS (например .cvsignore, .gitignoreи т. Д.). Эта опция предоставляет такую ​​возможность.

Перед архивацией каталога, содержит ли он какой - либо из следующих файлов: cvsignore, .gitignore, .bzrignore, или .hgignore. Если это так, прочитайте игнорировать шаблоны из этих файлов.

Шаблоны обрабатываются так же, как соответствующие VCS, то есть:

.cvsignore

Содержит шаблоны глобализации в стиле оболочки, которые применяются только к каталогу, в котором находится этот файл. Нет комментариев в файле. Пустые строки игнорируются.

.gitignore

Содержит ракушечные узоры. Применяется к каталогу, в котором .gitfileнаходится, и всем его подкаталогам.

Любая строка, начинающаяся с a, #является комментарием. Обратная косая черта экранирует символ комментария.

.bzrignore

Содержит шаблоны оболочки и регулярные выражения (если префикс RE:(16). Шаблоны влияют на каталог и все его подкаталоги.

Любая строка, начинающаяся с a, #является комментарием.

.hgignore

Содержит регулярные выражения posix (17). Линия syntax: globпереключается на шаблоны оболочки. Линия syntax: regexpпереключается обратно. Комментарии начинаются с #. Шаблоны влияют на каталог и все его подкаталоги.

  1. пример

tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/

TM
источник
-1

Следующий скрипт bash должен сделать свое дело. Он использует ответ, данный здесь Маркусом Сундманом.

#!/bin/bash

echo -n "Please enter the name of the tar file you wish to create with out extension "
read nam

echo -n "Please enter the path to the directories to tar "
read pathin

echo tar -czvf $nam.tar.gz
excludes=`find $pathin -iname "*.CC" -exec echo "--exclude \'{}\'" \;|xargs`
echo $pathin

echo tar -czvf $nam.tar.gz $excludes $pathin

Это распечатает нужную вам команду, и вы можете просто скопировать и вставить ее обратно. Вероятно, есть более элегантный способ предоставить ее непосредственно в командной строке.

Просто измените * .CC на любое другое распространенное расширение, имя файла или регулярное выражение, которое вы хотите исключить, и это все равно должно работать.

РЕДАКТИРОВАТЬ

Просто чтобы добавить небольшое объяснение; find генерирует список файлов, соответствующих выбранному регулярному выражению (в данном случае * .CC). Этот список передается через xargs команде echo. Это печатает - исключить «одну запись из списка». Косая черта () - это экранирующие символы для меток.

Джеймс
источник
1
Требование интерактивного ввода - плохой выбор дизайна для большинства сценариев оболочки. Вместо этого сделайте так, чтобы он читал параметры командной строки, и вы получите выгоду от завершения вкладок оболочки, завершения истории, редактирования истории и т. Д.
tripleee
1
Кроме того, ваш сценарий не работает для путей, которые содержат пробелы или метасимволы оболочки. По сути, вы всегда должны помещать переменные в двойные кавычки, если только вам не требуется, чтобы оболочка выполняла токенизацию пробелов и расширение по шаблону. Для получения дополнительной информации, пожалуйста, смотрите stackoverflow.com/questions/10067266/…
tripleee