Shell-Befehl zum tar-Verzeichnis mit Ausnahme bestimmter Dateien / Ordner

810

Gibt es einen einfachen Shell-Befehl / ein einfaches Shell-Skript, das das Ausschließen bestimmter Dateien / Ordner von der Archivierung unterstützt?

Ich habe ein Verzeichnis, das mit einem Unterverzeichnis archiviert werden muss, das eine Reihe sehr großer Dateien enthält, die ich nicht sichern muss.

Nicht ganz Lösungen:

Der tar --exclude=PATTERNBefehl entspricht dem angegebenen Muster und schließt diese Dateien aus. Ich muss jedoch bestimmte Dateien und Ordner ignorieren (vollständiger Dateipfad), da sonst gültige Dateien möglicherweise ausgeschlossen werden.

Ich könnte auch den Befehl find verwenden, um eine Liste von Dateien zu erstellen und diejenigen auszuschließen, die ich nicht archivieren und an tar übergeben möchte, aber das funktioniert nur für eine kleine Anzahl von Dateien. Ich habe Zehntausende.

Ich fange an zu denken, dass die einzige Lösung darin besteht, eine Datei mit einer Liste von auszuschließenden Dateien / Ordnern zu erstellen, dann mit rsync mit --exclude-from=filealle Dateien in ein tmp-Verzeichnis zu kopieren und dieses Verzeichnis dann mit tar zu archivieren.

Kann sich jemand eine bessere / effizientere Lösung vorstellen?

EDIT: Charles Ma 's Lösung funktioniert gut. Das große Problem ist, dass das --exclude='./folder' MUSS am Anfang des Tar-Befehls stehen muss. Vollständiger Befehl (CD zuerst, Sicherung ist also relativ zu diesem Verzeichnis):

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
Tiefbrunnen
quelle
120
Eine andere Sache, die mich darauf aufmerksam gemacht hat, könnte eine Anmerkung wert sein: Nachgestellte Schrägstriche am Ende ausgeschlossener Ordner führen dazu, dass tar diese Ordner überhaupt nicht ausschließt.
Rekhyt
7
@Rekhyt danke, ich starrte auf den Befehl für 15 Minuten ... dann 30
Earcam
9
Es scheint, dass die Position von --exclude von der Version von tar abhängt. Für tar 1.23 muss --exclude nach den Hauptbefehlen stehen.
Joel G Mathew
2
Vergessen Sie nicht das "'" (Anführungszeichen).
Meetai.com
3
--excludemuss nicht der erste sein, sondern muss irgendwo vor dem Quellverzeichnis stehen (getestet mit tar 1.29 auf Cygwin).
Wortwart

Antworten:

1038

Sie können also mehrere Ausschlussoptionen für Teer haben

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

etc wird funktionieren. Stellen Sie sicher zu stellen , --exclude bevor der Quell- und Zielartikel.

Charles Ma
quelle
78
Diese Antwort lässt es so aussehen, als ob --exclude an erster Stelle steht ... tar cvfpz ../stuff.tgz --exclude = 'node_modules' --exclude = '. Git'.
James O'Brien
13
Wenn Sie beispielsweise versuchen, Ihren WordPress-Projektordner mit Ausnahme des Upload-Ordners zu sichern, können Sie den folgenden Befehl verwenden: tar -cvf wordpress_backup.tar wordpress --exclude = wp-content /
uploads
12
Ich habe mir den folgenden Befehl tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz . ausgedacht : Beachten Sie, dass das -fFlag vor der TAR-Datei stehen muss, siehe: superuser.com/a/559341/415047
Alfred Bez
21
Ein "/" am Ende des Ausschlussverzeichnisses führt zum Fehlschlagen. Ich denke, Tar glaubt, dass ein Ende / Teil des Verzeichnisnamens ist, der ausgeschlossen werden soll. SCHLECHT: --exclude = mydir / GOOD: --exclude = mydir
Josiah
4
> Stellen Sie sicher, dass --exclude vor den Quell- und Zielelementen steht. ODER verwenden Sie einen absoluten Pfad für den Ausschluss: tar -cvpzf backups / target.tar.gz --exclude = '/ home / Benutzername / Backups' / home / Benutzername
NightKnight auf Cloudinsidr.com
131

Sie können Verzeichnisse mit --excludefor tar ausschließen.

Wenn Sie alles archivieren möchten, außer /usrSie können verwenden:

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

In deinem Fall vielleicht so etwas

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir
Johan Soderberg
quelle
17
Zur Verdeutlichung können Sie den vollständigen Pfad für --exclude verwenden.
Johan Soderberg
2
In einigen Fällen ist es erforderlich, dass --exclude vor den zu archivierenden Dateien / Ordnern steht
kronuus
68

Mögliche Optionen zum Ausschließen von Dateien / Verzeichnissen von der Sicherung mit tar:

Schließen Sie Dateien mit mehreren Mustern aus

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

Schließen Sie Dateien mit einer Ausschlussdatei aus, die mit einer Liste von Mustern gefüllt ist

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

Schließen Sie Dateien mithilfe von Tags aus, indem Sie eine Tag-Datei in einem beliebigen Verzeichnis ablegen, das übersprungen werden soll

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup
Stephen Donecker
quelle
3
Die Reihenfolge der Parameter scheint wichtig zu sein und diese Form funktioniert für mich.
Cstamas
1
Ich auch. Für tar (GNU tar) 1.28 unter Ubuntu 16.04 funktionierte nur diese spezielle Reihenfolge der Parameter.
Alvaroreig
43

alte Frage mit vielen Antworten, aber ich fand, dass keine für mich klar genug war, deshalb möchte ich meinen Versuch hinzufügen.

wenn Sie die folgende Struktur haben

/home/ftp/mysite/

mit folgenden Dateien / Ordnern

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

Sie möchten also eine TAR-Datei erstellen, die alles in / home / ftp / mysite enthält (um die Site auf einen neuen Server zu verschieben), aber file3nur Junk ist, und alles in folder3wird auch nicht benötigt, also werden wir diese beiden überspringen.

Wir verwenden das Format

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

Dabei ist c = create, z = zip und v = verbose (Sie können die eingegebenen Dateien sehen, um sicherzustellen, dass keine der von Ihnen ausgeschlossenen Dateien hinzugefügt wird). und f = Datei.

Mein Befehl würde also so aussehen

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

Beachten Sie, dass die ausgeschlossenen Dateien / Ordner relativ zum Stammverzeichnis Ihres Teers liegen (ich habe hier den vollständigen Pfad relativ zu / versucht, aber ich kann das nicht zum Laufen bringen).

hoffe, das wird jemandem helfen (und mir, wenn ich es das nächste Mal google)

Sverre
quelle
6
Diese Antwort hat mir definitiv geholfen! Das Problem für mich war, dass mein Befehl ungefähr so ​​aussah tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3', und dies schloss nichts aus.
Anish Ramaswamy
2
Ihre Probe war sehr ähnlich zu dem, mit dem ich Probleme hatte! Vielen Dank!
Qorbani
2
Schön und klar, danke. Für mich war das Problem, dass andere Antworten absolute relative Pfade beinhalten. Sie müssen jedoch nur den Namen des Ordners hinzufügen, den Sie ausschließen möchten.
Hubert
2
Dies ist eine viel klarere Antwort. Aufgrund des Beispiels konnte ich es zum Laufen bringen, da die Pfade zunächst verwirrend waren. Vielen Dank!
Fagiani
2
es funktionierte! Bitte denken Sie daran, dem Ausschluss keinen abschließenden Schrägstrich hinzuzufügen. Während beispielsweise "Datei3" oder "Datei3 / Unterordner" funktioniert, funktionieren "Datei3 /" und "Datei3 / Unterordner /" nicht!
Lucaferrario
24

Sie können die Standard-Ameisennotation verwenden, um relative Verzeichnisse auszuschließen.
Dies funktioniert für mich und schließt alle .git- oder node_module-Verzeichnisse aus:

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

myInputFile.txt enthält:

/ dev2 / java
/ dev2 / javascript

Eric Manley
quelle
4
Ich glaube, dies erfordert, dass die Bash-Shell-Optionsvariable globstaraktiviert sein muss. Überprüfen Sie mit shopt -s globstar. Ich denke, es ist standardmäßig auf den meisten Unix-basierten Betriebssystemen deaktiviert. Aus dem Bash-Handbuch: " globstar: Wenn festgelegt, **stimmt das in einem Dateinamenerweiterungskontext verwendete Muster mit allen Dateien und null oder mehr Verzeichnissen und Unterverzeichnissen überein. Wenn dem Muster ein '/' folgt,
stimmen
15

Ich habe das erlebt, zumindest mit der Cygwin- Version von tar, die ich verwende ("CYGWIN_NT-5.1 1.7.17 (0.262 / 5/3) 2012-10-19 14:39 i686 Cygwin" auf einer Windows XP Home Edition SP3-Maschine) ist die Reihenfolge der Optionen wichtig.

Während diese Konstruktion für mich funktionierte:

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

das hat nicht funktioniert:

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

Dies tar --helpzeigt zwar Folgendes:

tar [OPTION...] [FILE]

Der zweite Befehl sollte also auch funktionieren, aber anscheinend scheint dies nicht der Fall zu sein ...

Beste rgds,

GeertVc
quelle
5
Ich möchte nur hinzufügen, dass es wichtig ist, dass das auszuschließende Verzeichnis KEINEN endgültigen Backslash enthält. Also, --exclude = '/ path / to / Ausschluss / dir' ist RICHTIG , --exclude = '/ path / to / exclude / dir /' ist falsch .
GeertVc
17
Dies liegt daran, dass das Zielarchiv target.tgz ein Argument des f-Schalters ist, dem es folgen sollte
Valentino
14

Dieses Ausschlussmuster behandelt Dateinamensuffixe wie png oder mp3 sowie Verzeichnisnamen wie .git und node_modules

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}
Scott Stensland
quelle
danke - das habe ich gesucht :)
Alexander Br.
11

Für diejenigen, die Probleme damit haben, würden einige Versionen von tar nur ohne das './' im Ausschlusswert ordnungsgemäß funktionieren.

Tar --version

Teer (GNU-Teer) 1.27.1

Befehlssyntax, die funktioniert:

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

Diese werden nicht funktionieren:

$ 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 *
J. Lawson
quelle
10

Ich habe dies woanders gefunden, damit ich keine Gutschrift bekomme, aber es hat besser funktioniert als jede der oben genannten Lösungen für meine Mac-spezifischen Probleme (obwohl dies geschlossen ist):

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
rauben
quelle
2
Vielen Dank für diese Antwort, der Teer auf Darwin hat definitiv eine andere Syntax und es hat mich verrückt gemacht, warum "--exclude = blah" in den anderen Antworten nicht funktioniert hat. Dies funktionierte hervorragend auf einem Mac.
Michael
1
Vergessen Sie nicht, COPYFILE_DISABLE=1wenn Sie tar verwenden, sonst erhalten Sie möglicherweise ._-Dateien in Ihrem Tarball
Benoit Duffez
Vielen Dank für Ihre Antwort. Es ist immer schön, einen Link zu der Quelle hinzuzufügen, in der Sie die Antwort gefunden haben. Bonus: Wenn die Quelle von einem anderen Stackoverflow- oder Stackexchange-Post stammt, erhalten Sie zusätzliches Karma (entweder Punkte oder Abzeichen - ich weiß nicht mehr, welches). In jedem Fall bekommen sie ein Lächeln und jeder gewinnt. Keine Nachteile :-) Es hilft auch Leuten, wenn sie zusätzliche Informationen suchen möchten. Manchmal stimmen die Leute nur zu, weil Sie einen Quelllink eingefügt haben. Wenn Sie schließlich das spezifische Problem teilen, das hier angesprochen wurde, oder warum dies eine bessere Lösung war, kann dies jemand anderem bei einem einzigartigen Problem helfen.
SherylHohman
8

Für Mac OSX musste ich tun

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

Beachten Sie die -fnach dem--exclude=

Jerinaw
quelle
6

Ich bin damit einverstanden, dass das Flag --exclude der richtige Ansatz ist.

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

Ein warnendes Wort für eine Nebenwirkung, die ich nicht sofort offensichtlich fand: Der Ausschluss von 'fileA' in diesem Beispiel sucht REKURSIV nach 'fileA' !

Beispiel: Ein Verzeichnis mit einem einzelnen Unterverzeichnis, das eine gleichnamige Datei enthält (data.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • Bei Verwendung --exclude='data.txt'des Archivs nicht enthalten ENTWEDER data.txt Datei. Dies kann zu unerwarteten Ergebnissen führen, wenn Bibliotheken von Drittanbietern archiviert werden, z. B. ein Verzeichnis node_modules.

  • Um dieses Problem zu vermeiden, geben Sie den gesamten Pfad an, z --exclude='./dirA/data.txt'

Aaron Votre
quelle
5

Um mögliche 'xargs: Argument list too long'Fehler aufgrund der Verwendung von find ... | xargs ...bei der Verarbeitung von Zehntausenden von Dateien zu vermeiden , können Sie die Ausgabe von finddirekt an tarusing weiterleiten 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 -
carlo
quelle
Sie können die Zeichenfolge 'exclude' wie folgt zitieren: 'somedir / filesdir / *', dann erweitert die Shell keine Sternchen und andere weiße Zeichen.
Znik
xargs -n 1ist eine weitere Option, um xargs: Argument list too longFehler zu vermeiden ;)
Tuxdude
5

Nachdem ich diesen Thread gelesen hatte, habe ich ein wenig mit RHEL 5 getestet und hier sind meine Ergebnisse für das Teern des abc-Verzeichnisses:

Dadurch werden der Verzeichnisfehler und die Protokolle sowie alle Dateien unter den Verzeichnissen ausgeschlossen:

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

Durch Hinzufügen eines Platzhalters nach dem ausgeschlossenen Verzeichnis werden die Dateien ausgeschlossen, die Verzeichnisse jedoch beibehalten:

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'
Mike
quelle
Im zweiten Beispiel oben sollten Sternchen nach dem letzten Schrägstrich in jeder Ausschlussklausel stehen, aber der Beitrag hat sie nicht übernommen.
Mike
4

Verwenden Sie den Befehl find in Verbindung mit der Option tar append (-r). Auf diese Weise können Sie einem vorhandenen Teer in einem einzigen Schritt Dateien hinzufügen, anstatt einer Lösung mit zwei Durchgängen (Liste der Dateien erstellen, Teer erstellen).

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

Sie können je nach Ihren Anforderungen auch eine der Optionen "--exclude-tag" verwenden:

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

Der Ordner, in dem sich die angegebene DATEI befindet, wird ausgeschlossen.

frommelmak
quelle
4

Nachdem ich all diese guten Antworten für verschiedene Versionen gelesen und das Problem für mich selbst gelöst habe, denke ich, dass es sehr kleine Details gibt, die sehr wichtig und für den allgemeinen Gebrauch von GNU / Linux selten sind, die nicht genug betont werden und mehr als Kommentare verdienen.

Ich werde also nicht versuchen, die Frage für jeden Fall zu beantworten, sondern zu registrieren, wo gesucht werden muss, wenn die Dinge nicht funktionieren.

Es ist sehr wichtig zu beachten:

  1. Die Reihenfolge der Optionen ist wichtig: Es ist nicht dasselbe, das --exclude vor als nach der Dateioption und den zu sichernden Verzeichnissen zu setzen. Dies ist zumindest für mich unerwartet, da meiner Erfahrung nach bei GNU / Linux-Befehlen normalerweise die Reihenfolge der Optionen keine Rolle spielt.
  2. Verschiedene tar Versionen erwartet , dass diese Optionen in unterschiedlicher Reihenfolge: zum Beispiel @ Andrew Antwort zeigt an, dass in GNU tar v 1.26 und 1.28 die umfasst nicht kommt zuletzt, während in meinem Fall mit GNU tar 1.29, es ist die andere Art und Weise.
  3. DIE TRAILING SLASHES sind wichtig : Zumindest in GNU Teer 1.29 sollte es keine sein .

In meinem Fall war für GNU tar 1.29 auf Debian Stretch der Befehl, der funktionierte

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

Die Zitate spielten keine Rolle, es funktionierte mit oder ohne sie.

Ich hoffe, dass dies jemandem nützlich sein wird.

user2553863
quelle
Vielen Dank für Ihre Antwort. Ich habe nach einer Lösung gesucht (was sich sehr lange anfühlte), und Ihre Antwort hat mich in die richtige Richtung geführt. In meinem Fall (Ubuntu 18.04.3, Tar 1.29) konnte ich es jedoch nur mit dem Hinzufügen des Ordnernamens und NICHT des Pfads zum Laufen bringen, z. B.: Tar --exclude = folder1 --exclude = folder2 -czvf / opt / archieve. TGZ-Ordner
Nitai
2

Mit cpio (1) können Sie TAR-Dateien erstellen. cpio archiviert die Dateien auf stdin. Wenn Sie also bereits den Befehl find gefunden haben, mit dem Sie die zu archivierenden Dateien auswählen möchten, leiten Sie ihn an cpio weiter, um die TAR-Datei zu erstellen:

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

gnu tar v 1.26 --exclude muss nach Argumenten für Archivdatei und Sicherungsverzeichnis stehen, sollte keine führenden oder nachfolgenden Schrägstriche enthalten und bevorzugt keine Anführungszeichen (einfach oder doppelt). In Bezug auf das zu sichernde PARENT-Verzeichnis ist es also:

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

Andrew
quelle
Nach langem Experimentieren habe ich mit meinem Befehl in mehr oder weniger dasselbe gefunden tar (GNU tar) 1.28.
PicoutputCls
2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

-X gibt eine Datei an, die eine Liste von Dateinamen enthält, die von der Sicherung ausgeschlossen werden müssen. Zum Beispiel können Sie in dieser Datei * ~ angeben, um keine Dateinamen, die mit ~ enden, in die Sicherung aufzunehmen.

Ashwini Gupta
quelle
Ich denke, dies ist die beste Lösung, da es sogar in diesen Fällen funktioniert, dass die Anzahl der Ausschlüsse groß ist. Es ist auch möglich, die X-Option in das Optionspaket aufzunehmen, daher ist die kürzeste Form wahrscheinlich:tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Kai Petzke
0

Am besten verwenden Sie find mit tar über xargs (um die große Anzahl von Argumenten zu verarbeiten). Zum Beispiel:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
Joe
quelle
4
Dies kann dazu führen, dass tar mehrmals aufgerufen wird - und Dateien auch wiederholt gepackt werden. Richtig ist:find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
Jørgensen
Ich habe irgendwo gelesen, dass man bei der Verwendung xargsdie rOption tar verwenden sollte, anstatt , dass die xargs diese Ergebnisse (basierend auf dem Limit der lokalen Befehlszeilenargumente) in Chuncks aufteilen und tar für jeden Teil aufrufen, cwenn findtatsächlich viele Ergebnisse gefunden werden. Dies führt zu einem Archiv, das den letzten von zurückgegebenen Chunck xargsund nicht alle vom findBefehl gefundenen Ergebnisse enthält .
Stphane
0

Mögliche redundante Antwort, aber da ich sie nützlich fand, ist sie hier:

Als FreeBSD-Root (dh mit csh) wollte ich mein gesamtes Root-Dateisystem nach / mnt kopieren, aber ohne / usr und (offensichtlich) / mnt. Das hat funktioniert (ich bin bei /):

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

Mein ganzer Punkt ist, dass es notwendig war (durch Setzen der ./ ) anzugeben , dass die ausgeschlossenen Verzeichnisse, die Teil des größeren Verzeichnisses sind, kopiert werden sollen.

Meine € 0,02

George
quelle
0

Ich hatte kein Glück, Teer zu bekommen, um ein 5-Gigabyte-Unterverzeichnis mit einigen Tiefen auszuschließen. Am Ende habe ich nur den Unix-Zip-Befehl verwendet. Es hat viel einfacher für mich funktioniert.

Also für dieses spezielle Beispiel aus dem ursprünglichen Beitrag
(tar --exclude = '. / Folder' --exclude = '. / Upload / folder2' -zcvf /backup/filename.tgz.)

Das Äquivalent wäre:

zip -r /backup/filename.zip. -x Upload / Ordner / ** \ * Upload / Ordner2 / ** \ *

(HINWEIS: Hier ist der Beitrag, den ich ursprünglich verwendet habe und der mir geholfen hat: /superuser/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )

user2792605
quelle
3
Achtung: zipPackt keine leeren Verzeichnisse, tartut es aber !
t0r0X
0

Hör zu

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

Ich möchte eine neue Front-End-Version (eckiger Ordner) auf localhost haben. Außerdem ist der Git-Ordner in meinem Fall riesig und ich möchte ihn ausschließen. Ich muss es vom Server herunterladen und entpacken, um die Anwendung auszuführen.

Komprimieren Sie den Winkelordner aus / var / lib / tomcat7 / webapps und verschieben Sie ihn in den Ordner / tmp mit dem Namen angle.23.12.19.tar.gz

Befehl :

tar --exclude='.git' -zcvf /tmp/angular.23.12.19.tar.gz /var/lib/tomcat7/webapps/angular/
dobrivoje
quelle
0

Erfolgsfall: 1) Wenn Sie den vollständigen Pfad für die Sicherung angeben, sollte in exclude auch der vollständige Pfad verwendet werden.

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

2) Wenn Sie den aktuellen Pfad für die Sicherung angeben, sollte in exclude auch nur der aktuelle Pfad verwendet werden.

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

Fehlerfall:

  1. Wenn Sie das Verzeichnis currentpath für die Sicherung und den vollständigen Pfad für die Ignorierung angeben, funktioniert dies nicht

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

Hinweis: Das Erwähnen von Ausschluss vor / nach dem Sicherungsverzeichnis ist in Ordnung.

Sridhar Kumar N.
quelle
0

Wenn Sie versuchen, VCS-Dateien (Version Control System) auszuschließen, unterstützt tar bereits zwei interessante Optionen! :) :)

  1. Option: --exclude-vcs

Diese Option schließt Dateien und Verzeichnisse nach Versionskontrollsystemen verwendet: CVS, RCS, SCCS, SVN, Arch, Bazaar, Mercurial, und Darcs.

Ab Version 1.32 sind folgende Dateien ausgeschlossen:

  • CVS/und alles darunter
  • RCS/und alles darunter
  • SCCS/und alles darunter
  • .git/und alles darunter
  • .gitignore
  • .gitmodules
  • .gitattributes
  • .cvsignore
  • .svn/und alles darunter
  • .arch-ids/und alles darunter
  • {arch}/und alles darunter
  • =RELEASE-ID
  • =meta-update
  • =update
  • .bzr
  • .bzrignore
  • .bzrtags
  • .hg
  • .hgignore
  • .hgrags
  • _darcs

    1. Option: --exclude-vcs-ignores

Wenn Verzeichnisse Archivierung , die unter einem Versionskontrollsystem (VCS) sind, ist es oft bequem Ausschluss Muster aus dieser VCS‘zu lesen ignorieren Dateien (zB .cvsignore, .gitignoreusw.) Diese Option solche Möglichkeit bieten.

Bevor ein Verzeichnis der Archivierung sehen , ob es eine der folgenden Dateien enthält: cvsignore, .gitignore, .bzrignore, oder .hgignore. Wenn ja, lesen Sie Ignoriermuster aus diesen Dateien.

Die Muster werden ähnlich behandelt, wie das entsprechende VCS sie behandeln würde, dh:

.cvsignore

Enthält Globbing-Muster im Shell-Stil, die nur für das Verzeichnis gelten, in dem sich diese Datei befindet. In der Datei sind keine Kommentare zulässig. Leere Zeilen werden ignoriert.

.gitignore

Enthält Globbing-Muster im Shell-Stil. Gilt für das Verzeichnis, in dem .gitfilesich das Verzeichnis befindet, und alle seine Unterverzeichnisse.

Jede Zeile, die mit a beginnt, #ist ein Kommentar. Backslash entgeht dem Kommentarzeichen.

.bzrignore

Enthält Shell-Globbing-Muster und reguläre Ausdrücke (wenn RE:(16) vorangestellt ist . Muster wirken sich auf das Verzeichnis und alle seine Unterverzeichnisse aus.

Jede Zeile, die mit a beginnt, #ist ein Kommentar.

.hgignore

Enthält posix reguläre Ausdrücke (17). Die Linie syntax: globwechselt zu Shell-Globbing-Mustern. Die Leitung syntax: regexpschaltet zurück. Kommentare beginnen mit a #. Muster wirken sich auf das Verzeichnis und alle seine Unterverzeichnisse aus.

  1. Beispiel

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

TM
quelle
-1

Das folgende Bash-Skript sollte den Trick machen. Es verwendet die hier von Marcus Sundman gegebene Antwort .

#!/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

Dadurch wird der benötigte Befehl ausgedruckt und Sie können ihn einfach kopieren und wieder einfügen. Es gibt wahrscheinlich eine elegantere Möglichkeit, ihn direkt in der Befehlszeile bereitzustellen.

Ändern Sie einfach * .CC für eine andere gebräuchliche Erweiterung, einen Dateinamen oder einen regulären Ausdruck, den Sie ausschließen möchten, und dies sollte weiterhin funktionieren.

BEARBEITEN

Nur um eine kleine Erklärung hinzuzufügen; find generiert eine Liste von Dateien, die dem ausgewählten regulären Ausdruck entsprechen (in diesem Fall * .CC). Diese Liste wird über xargs an den Befehl echo übergeben. Dies druckt - einen Eintrag aus der Liste ausschließen. Die Schrägstriche () sind Escapezeichen für die Markierungen.

James
quelle
1
Das Erfordernis interaktiver Eingaben ist für die meisten Shell-Skripte eine schlechte Wahl für das Design. Lassen Sie es stattdessen Befehlszeilenparameter lesen, und Sie profitieren von der Vervollständigung der Registerkarte der Shell, der Vervollständigung des Verlaufs, der Bearbeitung des
Verlaufs
1
Darüber hinaus funktioniert Ihr Skript nicht für Pfade, die Leerzeichen oder Shell-Metazeichen enthalten. Grundsätzlich sollten Sie Variablen immer in doppelte Anführungszeichen setzen, es sei denn, Sie benötigen speziell die Shell, um Whitespace-Tokenisierung und Platzhaltererweiterung durchzuführen. Weitere Informationen finden Sie unter stackoverflow.com/questions/10067266/…
Tripleee