Frage an linux, gzip, shell, bash, loops – Wie gzip alle Dateien in allen Unterverzeichnissen in Bash

20

Ich möchte in Unterverzeichnissen meines aktuellen Standorts iterieren und jede Datei separat gzipen. Zum Zippen von Dateien in ein Verzeichnis verwende ich

<code>for file in *; do gzip "$file"; done
</code>

Dies kann jedoch nur für das aktuelle Verzeichnis und nicht für die Unterverzeichnisse des aktuellen Verzeichnisses gelten. Wie kann ich die obigen Anweisungen so umschreiben, dass auch die Dateien in allen Unterverzeichnissen gezippt werden?

Deine Antwort

3   die antwort
50

Keine Notwendigkeit für Schleifen oder etwas mehr alsfind undgzip:

<code>find . -type f ! -name '*.gz' -exec gzip "{}" \;
</code>

Dies findet alle regulären Dateien in und unter dem aktuellen Verzeichnis, deren Namen nicht mit dem enden.gz Erweiterung (dh alle Dateien, die noch nicht komprimiert sind). Es ruft aufgzip auf jede Datei einzeln.

Bearbeiten, basierend auf Kommentar vonuser unknown:

Die geschweiften Klammern ({}) werden durch den Dateinamen ersetzt, der direkt als einzelnes Wort an den folgenden Befehl übergeben wird-exec wie Sie hier sehen können:

<code>$ touch foo
$ touch "bar baz"
$ touch xyzzy
$ find . -exec echo {} \;

./foo
./bar baz
./xyzzy
</code>
+1 für die * .gz-Dateien ausschließen GuruM
Sie lernen jeden Tag etwas Neues. Danke für die Lektion! Adam Liss
Ihr letzter Satz ist eine häufige Fehlinformation. Find weiß, wo ein Dateiname beginnt und wo er endet. An sich hat es keine Probleme mit Leerzeichen oder Zeilenumbrüchen und anderen lustigen Dingen. Also ruft `-exec gzip {}` gzip mit einem einzelnen Dateinamen auf, und da keine Zwischen-Shell aufgerufen wird, die ein Leerzeichen als Trennzeichen interpretieren könnte, erhält gzip den gesamten Dateinamen. Der Hinweis in der Manpage von find scheint veraltet zu sein und bedeutet: Ihre Shell könnte versuchen, {} zu interpretieren, bevor sie an find übergeben wird, aber es wurde keine solche Shell gesehenjahrelang. user unknown
27

ich würde bevorzugengzip -r ./ das macht das selbe aber ist kürzer.

Sollte es nicht die beste Antwort sein ...? GyuHyeon Choi
5
<code>find . -type f | while read file; do gzip "$file"; done
</code>
Weil Ihre Antwort korrekter war und Sie sie aus unerklärlichen Gründen nicht richtig verstanden haben, habe ich meine Antwort dahingehend geändert, dass sie Ihre war. Beachten Sie nur, dass "nicht fördern" nicht unbedingt aktives Ablehnen bedeutet. Ich hätte meine Antwort nach Ihrem Kommentar geändert oder abgeschrieben. Tim Pote
@ c00kiemon5ter Hat eine Antwort, die funktioniert, aber möglicherweise unvollständig ist, eine Ablehnung verdient? Laut SO "Verwenden Sie Ihre Downvotes immer dann, wenn Sie auf einen ungeheuer schlampigen, mühelosen Beitrag stoßen oder auf eine Antwort, die eindeutig und möglicherweise gefährlich falsch ist." Diese Antwort ist keines dieser Dinge. Unvollständig, etwas schlampig, aber nicht falsch. Du hättest den Upvote-Prozess wahrscheinlich seinen Tribut fordern lassen und einen Kommentar hinterlassen sollen. Tim Pote
imo ist die antwort falsch. Farshid hat nie angegeben, dass die Dateien keine Sonderzeichen enthalten, daher beantwortet Ihre Antwort nur einen Sonderfall der Frage. Du bist besser dranfind .. | while read ... Korrigieren Sie Ihre Antwort und ich werde als erster abstimmen. Aber bitte mich nicht, falsche (imo) Antworten zu bewerben. c00kiemon5ter
Was ist, wenn eine Datei Leerzeichen oder andere Sonderzeichen enthält? das wird nicht funktionieren mitfor Dort c00kiemon5ter

Verwandte Fragen