Wie lösche ich nur Dateien, aber behalte die Verzeichnisstruktur bei?


16

Ich möchte jede Datei löschen, aber die Ordnerstruktur beibehalten. Gibt es einen Weg?

HINWEIS: (Ich verwende GNU Bash 4.1.5).


1
Wie genau wollen Sie "ausschließen"? Verwenden Sie einen Befehl? Wenn ja, aktualisieren Sie bitte Ihre Frage, um dies aufzunehmen.
SLM


Ich denke du meinst jede Datei löschen.
SLM

1
@slm Ich habe mit dem Befehl aktualisiert, den ich normalerweise verwende, um Dateien auszuschließen.
Tom Brito

Nein , Sie haben nicht :-) Oder, wenn Sie getan haben, können Sie es wieder entfernt
Mawg sagt wieder einzusetzen Monica

Antworten:


17

Versuche dies:

find . ! -type d -exec rm '{}' \;

Dadurch wird jede einzelne Datei mit Ausnahme von Verzeichnissen unterhalb des aktuellen Arbeitsverzeichnisses gelöscht. Gehen Sie mit diesem Befehl äußerst vorsichtig um.

Wenn die Version von findauf Ihrem Computer dies unterstützt, können Sie auch verwenden

find . ! -type d -delete

@slm: Ich bin mir nicht sicher, wie portabel das ist. Ich habe es als sekundäre Option hinzugefügt. Ich habe gerade festgestellt, dass meine Antwort durch meine Bearbeitung praktisch mit Ihrer identisch ist. Das tut mir leid; Es war nicht meine Absicht.

Schützt das '{}' vor Leerzeichen in Dateien? Ich sehe dich die ganze Zeit benutzen und ich glaube nicht, dass ich es jemals benutzt habe, bevor ich gesehen habe, dass du damit Lösungen postest.
SLM

Aus der GNU-Hilfeseite find: "Beachten Sie, dass die geschweiften Klammern in einfache Anführungszeichen eingeschlossen sind, um sie vor der Interpretation als Shellskript-Interpunktion zu schützen." Ich bin mir aber nicht sicher, wann es notwendig ist. Ich mache es meistens aus Gewohnheit. Der findBefehl sieht niemals die Anführungszeichen. Der {}Marker wird nur als Argument angesehen.

Ich sehe es im Beispiel, aber die Vorlagen zeigen dies, " -exec command {} +" & dies " -exec command ;". Ich habe \;in der Vergangenheit einfach nie das '{}' benutzt.
SLM

@slm: Die Vorlagen zeigen auch nicht das Ausblenden des Semikolons an, was im Allgemeinen erforderlich ist, wenn eine Shell zur Ausführung verwendet wird find. Ich denke, die Vorlagen sollen zeigen, welche Argumente der findBefehl benötigt, und sich um nichts in Verbindung mit der Shell kümmern.


1

So löschen Sie einfach jede reguläre Datei im aktuellen Verzeichnis und in den Unterverzeichnissen rekursiv:

zsh -c 'rm **/*(.)'

Nur zsh verfügt über Globbing-Qualifikationsmerkmale , um Dateien nach Typ zuzuordnen . Der rmBefehl funktioniert jedoch nicht für Verzeichnisse, sodass Sie ihn in bash verwenden können

shopt -s globstar
rm **/*

Dies funktioniert nur bei Befehlen rm. Im Allgemeinen können Sie Folgendes verwenden find:

find . -type f -delete

oder wenn dein findnicht unterstützt -delete:

find . -type f -exec rm {} +

-2

Ich hatte ähnliche Anforderungen, um Dateien aus einem Pfad und seinen Unterverzeichnissen zu löschen (nach Zeit filtern), ohne die Verzeichnisstruktur zu löschen.

Und ich habe das folgende Format verwendet, das für mich gearbeitet hat.

find / test123 / home / test_file_hip / data / nfs -mtime +6 -type f -exec rm {} \;

Syntex: find (Pfad der Datei) -mtime (größer oder kleiner als Tage) -type f -exec rm {} \;

-type: Erwähne den Dateityp "f" für das Verzeichnis "d" -exec: führe den Befehl rm aus: entferne {}: Ausgabe des Befehls find

Hinweis: Testen Sie es, bevor Sie es verwenden. Bitte zögern Sie nicht zu korrigieren oder zu aktualisieren, wenn ich etwas verpasst habe.


1
Da dies eine zusätzliche Anforderung ist, die vom OP nicht erwähnt wurde, und da die Grundstruktur find ... rmbereits abgedeckt wurde, bin ich mir nicht sicher, ob dies ein wertvoller Beitrag als neue Antwort auf diese Frage ist.
Jeff Schaller
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.