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 ls
oder tar
eines beliebigen Programms listet die Dateien wie erwartet auf. Wenn ich versuche, ein nicht rekursives rar
Archiv 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 rar
jede 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 |sort
Ihnen 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
- Es listet alle Verzeichnisse auf (nur Verzeichnisse in diesem Ordner!)
- Liste alle Dateien in einem der Verzeichnisse auf
- Sortieren
- 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:
- 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.
Und dann erstellen Sie die Listendatei
find topFolderOfTarget -type f | sort > listFile.txt
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.