Ich habe einen Ordner mit ca. 320116 .pdb.gz-Dateien. Ich möchte sie alle dekomprimieren. Wenn ich gunzip * .gz verwende, wird mir ein Fehler angezeigt, dh die Argumentliste ist zu lang. Der Ordner ist etwa 2 GB groß. Bitte machen Sie mir einen entsprechenden Vorschlag.
13
Antworten:
-exec gunzip {} +
wirdgunzip
mit vielen, aber nicht zu vielen Dateinamen in der Kommandozeile versehen. Dies ist effizienter als-exec gunzip {} \;
das Starten eines neuengunzip
Prozesses für jede einzelne Datei.quelle
find
wenigergunzip
!find
erlauben die "+" - Notation. Siehe zum Beispiel diefind
Manpage für BSD 10.1 . Gilt auch für OS X (mindestens 10.9 und später, möglicherweise früher).Immer wenn Sie die Fehlermeldung "Argumentliste zu lang" erhalten, können Sie sie umgehen, indem Sie den gewünschten Befehl mehrmals aufrufen, jeweils mit einer Teilmenge der Argumente, die Sie verwenden möchten.
xargs
ist ein Tool, mit dem Sie dies automatisch tun können.quelle
-execdir gunzip "{}" \;
xargs, das gunzip für jede datei separat aufruft? Das ist meine Lektüre der Manpage.xargs
werden so viele Dateinamen gespeichert, wie in diegunzip
Befehlszeile passen . Versuch es!echo a b c d e f | xargs echo
Ruft nurecho
einmal mit allen 6 Argumenten auf, sodass Sie eine Ausgabezeile sehen (ziemlich unnützer Befehl, der ausgeführt werden muss !!!!). Wenn Sie jedoch erzwingenxargs
, nur bis zu 3 Argumente pro Aufruf des Befehls mitecho a b c d e f | xargs -n 3 echo
anzugeben, erhalten Sie 2 Ausgabezeilen .xargs
ist, dass Sie mit dieser-P
Option mehreregunzip
Prozesse parallel ausführen können, was (abhängig von den genauen Parametern Ihres Systems) möglicherweise schneller geht.-P
hinweis auf , @psmears. Jetzt habe ich auch was gelernt!Ich denke das sollte funktionieren, es übergibt den Pfad / Namen jeder Datei einzeln an gunzip zur Verarbeitung:
quelle
find
mit+
undxargs
sind ausdrücklich Designer mit genau diesem Thema im Auge. Sie liefern immer so viele Argumente wie möglich, wobei das Limit des Betriebssystems nicht überschritten wird. Weil es sich übrigens um eine Betriebssystembeschränkung handelt, die nichts damit zu tun hatgunzip
.Versuchen Sie diesen Weg:
quelle
gunzip
einmal pro Datei ausgeführt. Siehe John1024 Antwort für eine etwas andere Art und Weise, dass die Ineffizienz vermeidet.Wenn Sie einen Multi-Core-Rechner haben, werden Sie wahrscheinlich feststellen, dass
gunzip
die Leistungsfähigkeit Ihres Rechners durch die Verwendung nicht voll ausgeschöpft wird. Dafür müssten Sie mehreregunzip
s parallel ausführen . Zu verfolgen, was in welchem Terminal von Hand gemacht wird, ist umständlich, aber das können Sie mit GNU parallel leicht tun:quelle
parallel
zu lang ist?find
zu lang ist?find
der Befehlszeile.-name
Es ist nicht notwendig,
find
dies zu verwenden, da Sie Unterordner nicht erwähnt haben. Was Sie tun müssen, ist:quelle
find
wenn Sie nicht möchten , 320.116 laichengunzip
Prozesse, wie diese Schleife tut.