Команда Shell для tar-каталогу, виключаючи певні файли / папки


810

Чи є проста команда / скрипт оболонки, яка підтримує виключення певних файлів / папок з архіву?

У мене є каталог, який потрібно заархівувати з підкаталогом, який містить ряд дуже великих файлів, які мені не потрібно робити резервну копію.

Не зовсім рішення:

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

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

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

Чи може хтось придумати краще / ефективніше рішення?

EDIT: Рішення Чарльза Ма працює добре. Велика проблема полягає в тому, що --exclude='./folder' ОБОВ'ЯЗКОВО бути на початку команди tar. Повна команда (спочатку cd, тому резервне копіювання відносно цього каталогу):

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

120
Ще одна річ, яка мене змусила на цьому, може бути варте зауваження: Покрокові косої риски в кінці виключених папок призведуть до того, що смола взагалі не виключає ці папки.
Рехіт

7
@Rekhyt спасибі, я дивився на команду 15 хвилин ... потім 30
earcam

9
Здається, позиція --exclude залежить від версії tar. Для tar 1.23, --exclude повинен виконуватись після основних команд.
Джоель Г Матвій

2
Не забувайте "" "(лапки).
Meetai.com

3
--excludeне повинно бути першим, але воно повинно бути десь перед вихідним каталогом (тестоване з tar 1.29 на Cygwin).
wortwart

Відповіді:


1038

Ви можете мати кілька варіантів виключення для дьогтю так

$ 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 вважає закінчення / частиною назви каталогів, яку потрібно виключити. BAD: --exclude = mydir / ДОБРО: --exclude = mydir
Джосія

4
> Обов'язково поставте --exclude перед початковими пунктами та пунктами призначення. АБО використовуйте абсолютний шлях для виключення: tar -cvpzf резервного копіювання / target.tar.gz --exclude = '/ home / username / backups' / home / username
NightKnight on Cloudinsidr.com

131

Ви можете виключити каталоги --excludeза допомогою tar.

Якщо ви хочете архівувати все, крім того, /usrви можете використовувати:

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

У вашому випадку можливо щось подібне

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir

17
Щоб уточнити, ви можете використовувати повний шлях для --exclude.
Йохан Содерберг

2
в деяких випадках потрібно, щоб --exclude передувало
архівам

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, який містить Everyting inside / 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 (я тут спробував повний шлях відносно /, але я не можу зробити це робочим).

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


6
Ця відповідь, безумовно, допомогла мені! Для мене було те, що моя команда виглядала приблизно так tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3', і це нічого не виключало.
Аніш Рамасвамі

2
Ваш зразок був дуже схожий на те, що я випустив! Дякую!
Корбані

2
Приємно і ясно дякую. Для мене питання полягало в тому, що інші відповіді включають абсолютний відносний шлях. Але все, що вам потрібно зробити - це додати ім’я папки, яку ви хочете виключити.
Губерт

2
Це набагато чіткіша відповідь. Через приклад мені вдалося змусити його працювати, оскільки спочатку контури були заплутані. Дякую купу!
fagiani

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
Я вважаю, що для цього потрібно globstarвключити змінну параметра оболонки Bash . Перевірте shopt -s globstar. Я думаю , що це від за замовчуванням на більшості Unix на основі ОС. З посібника Bash: " globstar: Якщо встановлено, шаблон, що **використовується в контексті розширення імені файлу, відповідатиме всім файлам, нульовим або більше директоріям і підкаталогам. Якщо за шаблоном дотримується" / ", відповідають лише каталоги та підкаталоги. "
not2qubit

15

Я переконався, що, принаймні, з Cygwin версією дьогтю, яку я використовую ("CYGWIN_NT-5.1 1.7.17 (0.262 / 5/3) 2012-10-19 14:39 i686 Cygwin" у домашній версії Windows XP Машина SP3) важливий порядок варіантів.

Поки ця конструкція працювала для мене:

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]

Отже, друга команда також повинна працювати, але, мабуть, це не так ...

Кращі rgds,


5
Просто хочу додати до сказаного, що важливо, щоб каталог, який виключається, НЕ містив остаточну косу рису. Таким чином, --exclude = '/ шлях / до / виключити / реж' є ПРАВИЛЬНО , --exclude = '/ шлях / до / виключити / реж /' є НЕПРАВИЛЬНО .
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 працюватимуть лише належним чином без значення "./" у значенні виключення.

Tar --version

дьоготь (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
Дякуємо за цю відповідь, у дьогті Дарвіна, безумовно, є інший синтаксис, і це зводило мене з думки, чому "--exclude = blah" в інших відповідях не працює. Це чудово працювало на mac.
Майкл

1
Не забувайте COPYFILE_DISABLE=1при використанні дьогтю, інакше ви можете отримати ._ файли у своєму
тарболі

Дякуємо, що включили вашу відповідь. Завжди приємно включити посилання на джерело, де ти знайшов відповідь. Бонус: якщо джерело було з іншого повідомлення про stackoverflow або stackexchange, ви отримуєте додаткову карму (або точки, або значки - я не пам'ятаю, який). Так чи інакше, вони отримують посмішку, і всі виграють. Ніяких недоліків :-) Він також допомагає людям, які хочуть шукати додаткову інформацію. Іноді люди звертаються з проханням лише тому, що ви включили посилання на джерело. Нарешті, обмін конкретною проблемою, на яку звертався, або чому це було кращим рішенням, може допомогти комусь іншому з унікальною проблемою.
ШерилХоман

8

Для Mac OSX мені довелося зробити

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

Зауважте -fпісля--exclude=


6

Я згоден - прапор - виключити - це правильний підхід.

$ 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'архіву не буде містити файл EITHER 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 -

Ви можете процитувати рядок "виключити", наприклад: "somedir / filesdir / *", тоді оболонка не збирається розширювати зірочки та інші білі символи.
Зник

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 додавання (-r). Таким чином, ви можете додати файли до існуючого дьогтю за один крок замість рішення з двома пропусками (створити список файлів, створити tar).

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;

4

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

  • --exclude-tag = FILE
  • --exclude-tag-all = FILE
  • --exclude-tag-under = FILE

Папка, що розміщує вказаний файл, буде виключена.


4

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

Тому я не збираюся відповідати на питання для кожного випадку, а натомість спробую зареєструвати, де шукати, коли все не працює.

ВАЖЛИВО ВАЖЛИВО ЗАУВАЖИТИ:

  1. ЗАМОВЛЕННЯ ВАРІАНТІВ ОПЦІЙ: це не те саме, що ставиться --exclude раніше, ніж після параметра файлу та каталогів для резервного копіювання. Принаймні, для мене це несподівано, тому що, на мій досвід, у командах GNU / Linux зазвичай порядок параметрів не має значення.
  2. Різні версії тарі очікують цього варіанту в різному порядку: наприклад, у відповіді Ендрю вказується, що в 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/

Цитати не мали значення, вони працювали з ними або без них.

Сподіваюся, це комусь стане у нагоді.


Спасибі за вашу відповідь. Я шукав (що дуже довго відчував) рішення, і ваша відповідь спрямовувала мене в правильному напрямку. Однак у моєму випадку (Ubuntu 18.04.3, Tar 1.29) я міг би змусити його працювати лише з додаванням імені папки, а НЕ шляхом, наприклад: tar --exclude = folder1 --exclude = folder2 -czvf / opt / archieve. папка tgz
Nitai

2

Ви можете використовувати cpio (1) для створення файлів tar. cpio приймає файли в архів на stdin, тому якщо ви вже зрозуміли команду find, яку ви хочете використовувати для вибору файлів архіву, передайте їх у cpio, щоб створити файл tar:

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz

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 вказує на файл, який містить список імен файлів, які повинні бути виключені з резервної копії. Для випадку, ви можете вказати * ~ у цьому файлі, щоб не включати в резервну копію файли, що закінчуються на ~.


Я думаю, це найкраще рішення, оскільки це працює навіть у тих випадках, коли кількість виключень велика. Також можливо включити опцію X у пакет опцій, тому найкоротша форма, ймовірно, є:tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Кай Петцке

0

Ваша найкраща ставка - використовувати find з tar, через xargs (для обробки великої кількості аргументів). Наприклад:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2

4
Це може призвести до виклику смоли кілька разів - і також буде пакувати файли неодноразово. Правильно:find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
jørgensen

Я десь читав, що при використанні 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

Мені не пощастило отримати дьоготь, щоб виключити підкаталог 5 гігабайт на кілька рівнів глибиною. Зрештою, я просто використав команду unix Zip. Це працювало мені набагато легше.

Отже, для цього конкретного прикладу з оригінальної публікації
(tar --exclude = '. / Папка' --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 )


3
Остерігайтеся: zipне пакує порожні каталоги, але tarробить!
t0r0X

0

Перевір

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName

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/

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

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


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. Якщо так, прочитайте шаблони ігнорування з цих файлів.

Шаблони обробляються так, як відповідна система ДКС обробляє їх, тобто:

.cvsignore

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

.gitignore

Містить шаблони в стилі оболонки. Застосовується до каталогу, де .gitfileзнаходиться, та всіх його підкаталогів.

Будь-який рядок, що починається з а #- це коментар. Підсумок ухиляється від персонажа коментаря.

.bzrignore

Містить структури шаблонів оболонок і регулярні вирази (якщо вони мають префікс RE:(16). Шаблони впливають на каталог та всі його підкаталоги).

Будь-який рядок, що починається з а #- це коментар.

.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/


-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 на будь-яке інше поширене розширення, ім'я файлу або регулярний вираз, який ви хочете виключити, і це все одно має працювати.

EDIT

Просто додати трохи пояснень; find генерує список файлів, що відповідають обраному регулярному вираженню (в даному випадку * .CC). Цей список передається через xargs до команди echo. Це друкує - виключає "один запис зі списку". Штрихи () є символами втечі для знаків '.


1
Потрібен інтерактивний вклад - це поганий вибір дизайну для більшості скриптів оболонки. Зробіть замість цього зчитування параметрів командного рядка, і ви отримаєте перевагу заповнення вкладки оболонки, завершення історії, редагування історії тощо
tripleee

1
Крім того, ваш скрипт не працює для шляхів, що містять пробіли білого простору або оболонки оболонки. В основному завжди слід розміщувати змінні в подвійних лапках, якщо ви спеціально не вимагаєте, щоб оболонка виконувала токенізацію пробілів та розширення підстановки. Для отримання додаткової інформації, будь ласка , см stackoverflow.com/questions/10067266 / ...
tripleee
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.