GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie tare ich Dateien mit einer sortierten Reihenfolge?

Für ein GNU tar :

--sort=ORDER
 Specify the directory sorting order when reading directories.
 ORDER may be one of the following:

`none'
      No directory sorting is performed. This is the default.

`name'
      Sort the directory entries on name. The operating system may
      deliver directory entries in a more or less random order, and
      sorting them makes archive creation reproducible.

`inode'
      Sort the directory entries on inode number. Sorting
      directories on inode number may reduce the amount of disk
      seek operations when creating an archive for some file
      systems.

Sie werden sich wahrscheinlich auch --preserve-order ansehen wollen .


Mit zsh , statt:

pax -w dir

Verwendung:

pax -dw dir dir/**/*(D)

Sie können dasselbe mit neueren Versionen von bash -O globstar -O dotglob tun mit:

pax -dw dir/**

Oder neuere Versionen von FIGNORE='@(.|..)' ksh93 -o globstar mit:

pax -dw dir dir/**

pax ist der Standardbefehl, um tar zu erstellen Dateien. Die Ausgabe geht nach stdout. Shell-Globs werden nach Namen sortiert.

Wenn Sie auf eine Arg-Liste zu lang stoßen Fehler, können Sie ändern zu:

printf '%s\0' dir dir/**/*(D) | pax -0dw

(nicht alle pax Implementierungen unterstützen -0 obwohl).


tar selbst kann dies nicht, also müssen Sie es aus einer korrekt geordneten Liste erstellen. Im Prinzip könnten Sie dann tar verwenden ist -T Option, aber es gibt keine Möglichkeit anzugeben, dass die Dateinamen in dieser Liste NUL-terminiert sein sollen. Wenn Sie also Dateinamen mit Zeilenumbrüchen haben (was erlaubt ist), wird dies einfach brechen.

Eine bessere Option ist die Verwendung von cpio um die Dateien zu generieren, da dies eine NUL-terminierte Liste von Dateinamen akzeptiert und tar-Dateien generieren kann.

Wenn Ihr tar Befehl wäre:

tar cvf /somedir/all.tar .

Damit dies nach Namen sortiert werden kann, müssten Sie Folgendes tun (unter der Annahme von GNU find und cpio):

find . -type f -print0 | sort -z | \
  cpio --create --null --format=ustar -O /somedir/all.tar

Dies hat jedoch den Nachteil, dass Unterverzeichnisse zwischen Dateinamen platziert werden. Mit find kannst du Tricks machen s -printf0 Angabe des Verzeichnisses und der Tiefeninformationen und Sortierung mit sort -n aber das beeinflusst auch, wie Dateien mit Nummern innerhalb eines Verzeichnisses sortiert werden.

Wenn das obige nicht zufriedenstellend ist, könnten Sie wahrscheinlich ein kleines Python-Programm verwenden, das auf os.walk() basiert um die gewünschte Reihenfolge mit voller Kontrolle zu generieren (Tiefe zuerst, basierend auf Erweiterung usw.), aber wenn Sie diesen Weg gehen, können Sie cpio genauso gut löschen und schreiben Sie die tar aus Datei mit Pythons tarfile Modul.


Linux
  1. So verschlüsseln Sie Dateien mit gocryptfs unter Linux

  2. So extrahieren Sie Tar-Dateien in ein bestimmtes oder anderes Verzeichnis in Linux

  3. So ändern Sie den Besitz von Dateien und Verzeichnissen mit dem Befehl chown

  4. So finden Sie rekursiv alle Dateien mit einer Dateigröße von Null (0) Bytes in einem Verzeichnis

  5. Wie finde ich alle Dateien mit einem bestimmten übergeordneten Verzeichnis in Linux?

So zählen Sie Dateien im Verzeichnis in Linux

So tarieren Sie bestimmte Dateitypen (Erweiterungen) in einem Verzeichnis

So zählen Sie Dateien im Verzeichnis unter Linux

Erste Schritte mit dem Tar-Befehl

So laden Sie Dateien mit FileZilla hoch

Wie benenne ich alle Dateien mit Sonderzeichen und Leerzeichen in einem Verzeichnis um?