Frage

Gibt es einen einfachen Shell-Befehl / Skript, das von der Archivierung mit Ausnahme bestimmte Dateien / Ordner unterstützt?

Ich habe ein Verzeichnis, das mit einem Unterverzeichnis archiviert werden muß, die eine Reihe von sehr großen Dateien Ich brauche nicht zu sichern hat.

Nicht ganz Lösungen:

Der tar --exclude=PATTERN Befehl entspricht das vorgegebene Muster und schließt diese Dateien, aber ich brauche bestimmte Dateien und Ordner ignorierten (vollständiger Dateipfad) werden, sonst gültige Dateien können ausgeschlossen werden.

Ich könnte auch den Befehl find verwenden, um eine Liste der Dateien zu erstellen und diejenigen ausschließen will ich nicht um die Liste zu Teer zu archivieren und weitergeben, aber das funktioniert nur mit einer kleinen Menge von Dateien. Ich habe Zehntausende.

Ich fange an, die einzige Lösung zu denken, ist eine Datei mit einer Liste von Dateien / Ordnern zu erstellen, um auszuschließen, dann rsync verwenden, um mit --exclude-from=file all Dateien in ein tmp-Verzeichnis zu kopieren und dann tar-Archiv verwenden, die Verzeichnis.

Kann jemand denken Sie an eine bessere / effizientere Lösung?

EDIT: Charles Ma 's-Lösung funktioniert gut. Der große gotcha ist, dass die --exclude='./folder' muss am Anfang des tar-Befehl sein. Voll Befehl (cd erste, so Sicherung ist relativ zu diesem Verzeichnis):

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

Lösung

Sie können mehrere ausschließen haben Optionen für Teer so

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

etc arbeiten. Machen Sie sicher setzen --exclude vor die Quell- und Ziel-Elemente.

Andere Tipps

Sie können ausschließen Verzeichnisse mit --exclude für Teer.

Wenn Sie alles zu archivieren außer /usr Sie verwenden können:

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

In Ihrem Fall vielleicht so etwas wie

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

Mögliche Optionen Ausschließen von Dateien / Verzeichnisse aus dem Backup mit tar:

Ausschließen von Dateien mit mehreren Mustern

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

Dateien ausschließen eine Datei mit einer Liste von Mustern gefüllt ausschließen mit

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

Ausschließen von Dateien mit Hilfe von Tags durch eine Tag-Datei in einem beliebigen Verzeichnis platzieren, die übersprungen werden sollen

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup

alte Frage mit vielen Antworten, aber ich fand, dass keiner für mich ganz klar genug war, so mag ich meinen Versuch hinzuzufügen.

, wenn Sie die folgende Struktur

/home/ftp/mysite/

mit folgenden Datei / Ordner

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

so wollen Sie eine tar-Datei machen, die every innen / home / ftp / mysite (zu bewegen, um die Website auf einen neuen Server) enthält, aber file3 ist nur Müll, und alles in folder3 ist auch nicht erforderlich, so dass wir überspringen werden diese beiden.

Wir verwenden das Format

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

, wo die c = schaffen, z = zip, und v = verbose (Sie die Dateien sehen können, wie sie eingegeben werden, sehr nützlich, dass keine der Dateien, damit Sie ausschließen hinzugefügt werden). und f = Datei.

so, mein Befehl würde wie folgt aussehen

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

Beachten Sie die Dateien / Ordner ausgeschlossen relativ zu der Wurzel Ihres Teers sind (ich habe vollständigen Pfad hier relativ versucht, / aber ich kann nicht, dass die Arbeit machen).

hoffen, dass dies jemand helfen (und mir, dass ich es beim nächsten Mal google)

Sie können mit Standard "ant Notation" Verzeichnisse relativ auszuschließen.
Dies funktioniert für mich und schließt jegliche .git oder node_module Verzeichnisse.

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

Ich habe erfahren, dass zumindest mit der Cygwin Version von tar Ich verwende ( "CYGWIN_NT-5.1 1.7.17 (0.262 / 03.05) 2012.10.19 14: 39 i686 Cygwin“auf einem Windows XP Home Edition SP3 Maschine), die Reihenfolge der Optionen ist wichtig.

Während diese Konstruktion funktioniert für mich:

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

, dass ein hat nicht Arbeit:

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

Dieses, während tar --help ergibt folgendes:

tar [OPTION...] [FILE]

So sollte der zweite Befehl auch funktionieren, aber anscheinend scheint es nicht der Fall zu sein ...

Best rgds,

Dies schließt Muster behandelt Dateinamensuffix wie png oder mp3 sowie Verzeichnisnamen wie .git und node_modules

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}

fand ich diese woanders so werde ich Kredit nicht nehmen, aber es funktionierte besser als jede der oben genannten Lösungen für meinen Mac spezifische Themen (auch wenn diese geschlossen ist):

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>

Für diejenigen, die Probleme mit ihm haben, würden einige Versionen von tar nur funktionieren, ohne die ‚./‘ im ausschließen Wert.

Tar --version
  

tar (GNU tar) 1.27.1

Befehlssyntax, die funktionieren:

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

Diese wird 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 *

Für Mac OSX ich tun musste,

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

Beachten Sie die -f nach dem --exclude=

Ich bin damit einverstanden die --exclude Flagge der richtige Ansatz ist.

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

Ein Wort Warnung für einen Nebeneffekt, dass ich nicht sofort offensichtlich gefunden: Der Ausschluss von 'dateiA' in diesem Beispiel wird für 'dateiA' Suche REKURSIVES!

Beispiel: Ein Verzeichnis mit einem einzigen Unterverzeichnis eine Datei mit dem gleichen Namen (data.txt)

enthält
data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • Bei der Verwendung von --exclude='data.txt' das Archiv enthält nicht ENTWEDER Datei data.txt. Dies kann zu unerwarteten Ergebnissen führen, wenn Dritte Bibliotheken Archivierung, wie ein node_modules Verzeichnis.

  • Um dieses Problem zu vermeiden, stellen Sie sicher, den gesamten Weg zu geben, wie --exclude='./dirA/data.txt'

möglich 'xargs: Argument list too long' Fehler zu vermeiden aufgrund der Verwendung von find ... | xargs ... wenn Zehntausende von Dateien verarbeiten, können Sie die Ausgabe der find direkt an tar find ... -print0 | tar --null ... verwendet wird.

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

diesen Thread Nach der Lektüre habe ich ein wenig Tests auf RHEL 5 und hier sind meine Ergebnisse für Teer des abc Verzeichnisses:

Dies wird die Verzeichnisse Fehler und Protokolle und alle Dateien unter den Verzeichnissen ausschließen:

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

Das Hinzufügen eines Platzhalter nach dem ausgeschlossenen Verzeichnis die Dateien ausschließen, sondern bewahren Sie die Verzeichnisse:

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

Verwenden Sie den Befehl in Verbindung mit der tar append (-r) Option. Auf diese Weise kann in einem einzigen Schritt, statt einer zwei Pass-Lösung (erstellen Liste von Dateien, Erstellen von tar-Dateien) zu einem bestehenden tar hinzuzufügen.

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

Sie können auch eine der „--exclude-Tag“ Optionen verwenden, je nach Bedarf:

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

Der Ordner der angegebenen Datei-Hosting, wird ausgeschlossen.

Sie können cpio (1) verwenden, um tar-Dateien zu erstellen. cpio nimmt die Dateien auf stdin zu archivieren, so dass, wenn Sie bereits den Befehl find herausgefunden haben, die Sie verwenden möchten die Dateien das Archiv, über eine Pipe in cpio wählen Sie die TAR-Datei zu erstellen:

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

Gnu tar v 1.26 die --exclude nach Archivdatei und Backup-Verzeichnis Argumente kommen muss, sollte keine führende oder nachgestellte Schrägstriche haben, und bevorzugt keine Anführungszeichen (einfach oder doppelt). So in Bezug auf das übergeordnete Verzeichnis gesichert werden, es ist:

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

all diese guten Antworten für verschiedene Versionen Nach dem Lesen und gelöst, die das Problem für mich, ich denke, gibt es sehr kleine Details, die sehr wichtig sind, und selten zu GNU / Linux allgemeinem Gebrauch , die aren ‚t genug betont und verdient mehr als Kommentare.

Also ich werde versuchen, die Frage nicht für jeden Fall zu beantworten, sondern stattdessen versuchen, zu registrieren, wo sie suchen , wenn die Dinge nicht funktionieren.

ES IST SEHR WICHTIG HINWEIS:

  1. DER ORDEN DES MATTER OPTIONEN: es ist das gleiche nicht die --exclude setzen vor als nach der Datei Option und Verzeichnisse zu sichern. Dies ist unerwartet, zumindest für mich, weil in meiner Erfahrung in GNU / Linux-Befehle, in der Regel die Reihenfolge der Optionen spielt keine Rolle.
  2. Verschiedene tar Versionen erwartet, dass diese Optionen in unterschiedlicher Reihenfolge: zum Beispiel @ Antwort Andrew , dass im letzten v 1.26 und 1.28 die schließt in GNU tar zeigt kommt, während in meinem Fall mit GNU tar 1.29, es ist die andere Art und Weise.
  3. THE folgende Schrägstriche MATTER : mind. In GNU tar 1.29, sollte nicht sein

In meinem Fall für GNU tar 1,29 auf Debian Strecke, den Befehl, der arbeitete, war

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

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

Ich hoffe, das jemand von Nutzen sein wird.

Ihre beste Wette ist mit Teer finden zu verwenden, über xargs (die große Anzahl von Argumenten zu handhaben). Zum Beispiel:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

-X zeigt eine Datei, die eine Liste von Dateinamen enthält, die von der Sicherung ausgeschlossen werden muß. Zum Beispiel können Sie * ~ in dieser Datei angeben, keine Dateinamen enthalten mit ~ in der Sicherung zu beenden.

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

Während ein FreeBSD root (das heißt mit csh) Ich wollte mein ganzes Root-Dateisystem / mnt kopieren, aber ohne / usr und (natürlich) / mnt. Das ist, was funktioniert hat (ich bin /):

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

Mein ganzer Punkt ist, dass es notwendig war (indem man die ./ ) auf angeben , um Teer, dass die ausgeschlossenen Verzeichnisse, in denen einen Teil des größeren Verzeichnisses kopiert werden.

Mein € 0,02

Ich hatte kein Glück Teer bekommt ein 5 Gigabyte Unterverzeichnis ein paar Ebene tief auszuschließen. Am Ende habe ich nur den Unix-Zip-Befehl. Es funktionierte sehr viel einfacher für mich.

So für dieses Beispiel aus dem ursprünglichen Post
(Tar --exclude = '/ Ordner' --exclude =‘. / Upload / folder2' -zcvf /backup/filename.tgz.)

Das Äquivalent wäre:

  

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

(Hinweis: Hier ist der Beitrag habe ich ursprünglich verwendet, die mir geholfen https://superuser.com/questions/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )

Überprüfen Sie es heraus

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

Der folgende Bash-Skript sollte es tun. Es verwendet die Antwort gegeben hier von Marcus Sundman.

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

Dies wird Sie müssen aus dem Befehl drucken und Sie können es nur in kopieren und einfügen zurück. Es ist wahrscheinlich eine elegantere Möglichkeit es direkt in die Befehlszeile zur Verfügung zu stellen.

Just ändern * .CC für andere gemeinsame Erweiterung, Dateinamen oder regex Sie ausschließen möchten, und dies sollte immer noch funktionieren.

EDIT

Nur eine kleine Erklärung hinzuzufügen; find generiert eine Liste von Dateien, die gewählte regex (in diesem Fall * .CC) entsprechen. Diese Liste wird über xargs den Echo-Befehl übergeben. Dies druckt --exclude ‚einen Eintrag aus der Liste‘. Die Schrägstriche () sind Escape-Zeichen für die "Mark.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top