Erstellen eines rekursiv sortierten RAR-Archivs

Erstellen eines rekursiv sortierten RAR-Archivs

Aus verschiedenen Gründen habe ich mich entschieden, zum Speichern einiger Daten ein RAR-Archiv anstelle eines komprimierten Tar-Archivs zu verwenden.

Bin mit der Entscheidung zufrieden, bis auf eine Sache: Ich kann keine Möglichkeit finden, Dateien sortiert zu speichern. Die Reihenfolge der Dateien ist wichtig, da ich vorhabe, das Archiv abzufragen, und die Ergebnisse sortiert sein sollten.
Meine Dateistruktur sieht folgendermaßen aus:

2000/
  001.txt
  002.txt
  ...
2001/
  ...
2002/
...
2011/

Ordner stellen also Jahre dar und die darin enthaltenen Dateien sind nummeriert. Die Verwendung von lsoder tareines beliebigen Programms listet die Dateien wie erwartet auf. Wenn ich versuche, ein nicht rekursives rarArchiv zu erstellen (d. h. Dateien nur im Ordner 2000 zu komprimieren), werden die Dateien sortiert gespeichert, aber wenn ich versuche, Dateien rekursiv hinzuzufügen ( rar a -r), werden die Dateien durcheinander gebracht.

Ich kann keinen Schalter finden außer:

n@            Read file names to include from stdin

mit dem ich kein Glück hatte, es nutzbar zu machen.

Ich könnte rarjede Datei wie folgt aufrufen:

for f in */*.txt ; do rar a -r archive.rar $f ; done

aber das ist nicht sehr schlau.

Irgendwelche Ideen?


Da ich die Antwort unten kommentiert habe, wollte ich die Frage aktualisieren:

Es ist mir gelungen, sortierte Dateien ähnlich wie in der nicht so cleveren Zeile oben zu speichern:

for d in */ ; do rar a -r archive.rar $d*.txt ; done

was für das obige Szenario natürlich gut funktioniert,

Ich habe noch nicht herausgefunden, wie man n@switch benutzt. Ich benutzeRAR 4.10 beta 5

Antwort1

Verwenden von rar unter Ubuntu

(RAR 3.90 Beta 2 Copyright (c) 1993-2009 Alexander Roshal 3. Juni 2009)

das Beste, was Sie tun können, ist Folgendes:

find * -type f | sort | xargs rar a ../eliezer.rar

Was Sie auspacken mit:

unrar x eliezer.rar

Zumindest wird dadurch nicht für jede Datei rar aufgerufen.

Der Schalter -n@ scheint nur für Dateien zu funktionieren. Beispiel:

find * -type f | rar a ../eliezer.rar -n@

erzeugt "WARNUNG: Keine Dateien", wenn keine regulären Dateien im CWD vorhanden sind, aber

find * -type d | rar a ../eliezer.rar -n@ -r

funktioniert für die Verzeichnisse.

Der rekursive Schalter -r von rar liest die Dateinamen in der Reihenfolge, in der sie in der dirent-Struktur erscheinen (man readdir). Die einzige Möglichkeit, die Reihenfolge zu ändern, in der rar die Dateien packt, besteht darin, die Reihenfolge der Dateien in den Verzeichnisdateistrukturen (normalerweise die Erstellungsreihenfolge) zu manipulieren, bevor Sie rar aufrufen. Sie können dies mit einem Verzeichniseditor tun, mit der Einschränkung, dass einige Dateisystemtypen die Reihenfolge der Dateien in der Verzeichnisstruktur im Rahmen ihrer Speicherbereinigung oder Optimierung ändern könnten.

Antwort2

Ist es Ihnen wirklich wichtig, wie rar die Daten „speichert“?
Würde es unrar v archive.rar |sortIhnen keine richtig sortierte Liste liefern?

Antwort3

Ich hatte ein ähnliches Problem wie in der Frage beschrieben und bin zu dieser Lösung gekommen:

for d in *; do find "${d}/" -type f | sort | rar a "${d}.rar" @; done
  1. Es listet alle Verzeichnisse auf (nur Verzeichnisse in diesem Ordner!)
  2. Liste alle Dateien in einem der Verzeichnisse auf
  3. Sortieren
  4. benutze das @ ohne irgendetwas Sünde

Antwort4

Informationen hierzu scheinen sehr spärlich zu sein. Diese Frage hat mir jedoch trotzdem geholfen, herauszufinden, wie es geht. Daher werde ich den Vorgang hier für zukünftige Suchende veröffentlichen.

Entsprechend:http://acritum.com/winrar/console-rar-manual

RAR command line syntax:
RAR <command>  [ -<switches> ]  <archive>  [ <@listfiles…> ]
[ <files…> ]  [ <path_to_extract\> ]

Listfiles are plain text files that contain names of files to process.
File names should start at the first column. It is possible to
put comments to the listfile after // characters. For example,
you may create backup.lst containing the following strings:

c:\work\doc\*.txt         //backup text documents
c:\work\image\*.bmp       //backup pictures
c:\work\misc

and then run:

rar a backup @backup.lst

If you wish to read file names from stdin (standard input),
specify the empty listfile name (just @).

Win32 console RAR uses OEM (DOS) encoding in list files.

You may specify both usual file names and list files in the same
command line. If neither files nor listfiles are specified,
then *.* is implied and RAR will process all files

Der Ablauf wäre also:

  1. Wechseln Sie zum Stammverzeichnis des Speicherorts, von dem Sie archivieren möchten, oder verwenden Sie absolute Pfade. Beachten Sie jedoch, dass ein absoluter Pfad ebenfalls im Archiv landet.
  2. Und dann erstellen Sie die Listendatei

    find topFolderOfTarget -type f | sort > listFile.txt

  3. Führen Sie dann rar mit @listfile.txt aus

    rar a archiveName @listFile.txt

Alternativ können Sie das Erstellen einer Listendatei überspringen:

find topFolderOfTarget -type f | sort | rar a archiveName @

Der Grund, warum dies für mich nützlich war, ist, dass ich ein mehrteiliges Archiv erstellte und es für ein Backup hochlud. Wenn ich nur eine oder zwei Dateien oder Ordner brauche, kann ich einfach die relevanten Teile abrufen und muss nicht das Ganze herunterladen. Ich bin sicher, dass der Inhalt richtig gruppiert wird.

verwandte Informationen