So löschen Sie Verzeichnisse basierend auf der `find`-Ausgabe: NUR das erste Ergebnis

So löschen Sie Verzeichnisse basierend auf der `find`-Ausgabe: NUR das erste Ergebnis

Basierend auf dieser Frage,

Wie lösche ich Verzeichnisse basierend auf der „Find“-Ausgabe?

Ich habe versucht, nur den ersten Ergebnisordner zu entfernen, indem ich Folgendes gemacht habe:

find * -type d | head -n1 | -exec rm -rf {} \;

Aber ich erhalte diesen Fehler:

bash: -exec: command not found

Was ist falsch?

Antwort1

Sie können -quitnach der Verwendung von -deleteoder Folgendes verwenden -exec:

-aufhören
Beenden Sie sofort. Es werden keine untergeordneten Prozesse weiter ausgeführt, aber es werden keine in der Befehlszeile angegebenen Pfade mehr verarbeitet.


Löschen des ersten Ergebnisses Ihres findBefehls:

find * -type d -exec rm -Rf {} \; -quit

oder

find . ! -path . -type d -exec rm -Rf {} \; -quit

Letzteres findet versteckte Ordner.


Beachten Sie, dass Ihre Suchausgabe möglicherweisenicht alphabetisch sortiert werden.

Zum Löschen des ersten Ergebnisses nach der Sortierung:

find * -maxdepth 1 -type d -print0 | sort -z | head -zn1 | xargs -r0 rm -Rf

Verwenden Sie zum numerischen Sortieren sort -zn.

Antwort2

pLumo hat einige gute Alternativlösungen angebotenin ihrer AntwortIch biete einen völlig anderen Ansatz.

Sie werden feststellen, dass der Befehl, so wie Sie ihn bei der Beschreibung der Suchpfade auf oberster Ebene findverwenden , eigentlich nur verwendet wird für*Suche nach dem ersten Verzeichnis unter den Namen, das *sich zu.

Sie können dies auch mit einer Shell-Schleife tun, wodurch der Code leichter zu lesen ist und man leichter erkennen kann, was er bewirkt:

shopt -s dotglob nullglob

for name in *; do
    if [ -d "$name" ] && [ ! -h "$name" ]; then
        rm -rf -- "$name"
        break
    fi
done

Diese Schleife, die in einer Shell ausgeführt wird bash, durchläuft alle Namen, die mit übereinstimmen *(einschließlich versteckter Namen). Der Hauptteil der Schleife prüft, ob der aktuelle Name ein Verzeichnis ist (ohne ein symbolischer Link zu einem Verzeichnis zu sein), und löscht das Verzeichnis rekursiv, bevor die Schleife verlassen wird.

zshEin ähnlicher Effekt könnte in der Shell mit dem viel einfacheren Befehl erzielt werden

rm -rf -- *(D/[1])

Dadurch wird das erste Verzeichnis entfernt, *auf das erweitert wird. Der Globbing-Qualifizierer (D/[1])beschränkt die Übereinstimmung *auf nur Verzeichnisse ( /), schließt aber versteckte Namen ( D) ein und gibt nur den ersten übereinstimmenden Namen ( [1]) zurück. Wenn sich im aktuellen Verzeichnis keine Verzeichnisse befinden, erhalten Sie von der Shell die Fehlermeldung „Keine Übereinstimmungen gefunden“.

Antwort3

Dies scheint sehr gefährlich, aber Sie könnten Folgendes versuchen:

find * -type d | head -n1 | xargs rm -rf

Antwort4

bei mir hat dieser Code funktioniert:

  • findet NUR die Dateien mit -Typ f,
  • Dateien filtern, die nicht ".gz" enthalten
  • Wählen Sie N Dateien aus, in diesem Fall NUR DIE ERSTE -n 1

Code:

finden . -Typ f ! -Name "*.gz" | Kopf -n 1 | xargs rm -rf {} ;

verwandte Informationen