So verwenden Sie GNU parallel zu gunzip

5566
gc5

Ich habe ein Verzeichnis voll .gz, ich möchte jedes Archiv parallel zu GNU parallel erweitern. Ich habe jedoch nichts erreicht.

Ich habe es versucht

parallel 'gunzip {}' ::: `ls *.gz` parallel gunzip `ls *.gz` 

ohne ergebnis sagt mir bash:

/bin/bash: archive1.gz: command not found ... 

Was mache ich falsch?

Vielen Dank

6
GNU parallel, +1 n13 vor 10 Jahren 2
GNU parallel ist auf meiner Plattform nicht verfügbar. Gibt es eine Möglichkeit, dies mit xargs zu tun (ich möchte nicht mehr GZ-Instanzen als meine Anzahl von Kernen ausführen). user2284570 vor 9 Jahren 0

2 Antworten auf die Frage

6
terdon

Ich fand dies, was darauf schließen lässt, die mit --gnuFlagge:

parallel --gnu gunzip ::: *gz 

Wenn dies funktioniert, sollten Sie /etc/parallel/configden Inhalt entweder löschen oder ändern ( --gnuanstatt als --tollefroot):

echo "--gnu" > /etc/parallel/config 

Auch nie die Ausgabe analysieren ls. , benutze Globbing wie oben oder findstattdessen:

find . -name "*gz*" -print0 | parallel -q0 gunzip 
Es funktioniert total .. danke für Tipps und Korrekturen. gc5 vor 10 Jahren 0
Das Parsen der Ausgabe von "ls" ist weniger problematisch, wenn Sie in GNU Parallel einleiten. Solange Sie keine böswilligen Benutzer haben, die Dateinamen mit \ n erstellen, sind Sie sicher. In diesem Fall wäre "::: * .gz" jedoch wahrscheinlich das Beste. Ole Tange vor 10 Jahren 1
Das Einfügen von \ n in Dateinamen macht wirklich Spaß, danke für den Tipp. Für kleine Administrationsaufgaben sollte dies jedoch kein Problem sein, daher lohnt es sich nicht, ein anderes IMHO-Tool zu verwenden. Aki vor 10 Jahren 0
@Aki Tatsächlich lohnt es sich SEHR, das richtige Werkzeug für den Job zu verwenden. Die Ausgabe von ls ändert sich zwischen * nix-Geschmacksrichtungen und Gebietsschema-Einstellungen. Sie neigt dazu, auf jeder Art von Leerzeichen zu brechen, nicht nur bei Zeilenumbrüchen. Sie werden viele Schmerzen vermeiden, wenn Sie sich daran gewöhnen, ls nicht zu analysieren. Globbing ist einfacher und sicherer. terdon vor 10 Jahren 0
@terdon: `für i in $ (ls) mache den Befehl" $ i "; done`, ich benutze das viel und Globing ist nicht immer eine Option. Gewohnheiten erstellen <Die Einschränkungen der Werkzeuge verstehen, die ich verwende. Natürlich ist es bei sensiblen Aufgaben wichtig, vorsichtig zu sein, aber es sollte Raum für schnelle Redewendungen gelassen werden, die einfach funktionieren, unabhängig davon, ob sie nicht für alles geeignet sind Aki vor 10 Jahren 0
@Aki `für i in *; Befehl "$ i"; done` ist einfacher zu schreiben und sicherer. Warum sollten Sie eine Sprache lernen, die schwieriger und riskanter ist? Versuchen Sie `for i in $ (ls)` in einem Verzeichnis, das Dateien enthält, deren Namen Leerzeichen enthalten. Im Ernst, das Parsen von 'ls' ist fast immer nicht der richtige oder einfachste Weg, Dinge zu tun. Wenn Globbing keine Option ist, verwenden Sie "find". Wenn Sie auf der Verwendung von 'ls' bestehen, verwenden Sie zumindest keine for-Schleife. Dies ist viel sicherer: `ls | während ich lese; Befehl "$ i"; done` Zumindest bricht das nicht bei Leerzeichen. terdon vor 10 Jahren 1
@terdon: Ich habe nicht daran gedacht, das Globing dort zu verwenden und danke für die while-Loop-Beratung. Ich habe immer etwas gebraucht, weil ich nicht besser lernen würde, das ist jetzt behoben Aki vor 10 Jahren 0
@terdon: GNU parallel ist auf meiner Plattform nicht verfügbar. Gibt es eine Möglichkeit, dies mit xargs zu tun (ich möchte nicht mehr GZ-Instanzen als meine Anzahl von Kernen ausführen). user2284570 vor 9 Jahren 0
0
parkydr

Das funktioniert:

 ls *.gz | parallel -t gunzip 

Das -tist optional, aber es ist nützlich, da es Ihnen zeigt, welche Befehle auf stderr ausgeführt werden.

Ich bin nicht sicher, ob Sie etwas falsch machen, :::sollte funktionieren (es soll gleichwertig sein), aber nicht einmal die Beispiele auf der Manpage funktionieren für mich.

Update: Die --gnuFlagge macht es so, wie Terdon sagte.

Ich weiß nicht warum, aber es funktioniert nicht: `gzip: stdin: nicht im gzip-Format` .. Trotzdem danke gc5 vor 10 Jahren 0
Seltsam, arbeitet für mich parkydr vor 10 Jahren 0
Ja, es ist komisch .. Welche Plattform benutzt du? gc5 vor 10 Jahren 0
Debian jessie/sid (testing). Did your files have spaces in the names? parkydr vor 10 Jahren 0
Die Räume haben auch funktioniert parkydr vor 10 Jahren 0
Nein, sie haben nicht .. Ich verwende Ubuntu 12.04 LTS .. gc5 vor 10 Jahren 0