Find-Befehl: Verwenden von {} in einem Pfad

Find-Befehl: Verwenden von {} in einem Pfad

Ich habe versehentlich die Ordner in meinem MusicVerzeichnis in das übergeordnete michalVerzeichnis kopiert. Ich möchte diese Verzeichnisse auf einen Schlag löschen.

Gibt es eine Möglichkeit, das Folgende zum Laufen zu bringen? Oder gibt es eine bessere Alternative?

/home/michal/Music $ find . -type d -maxdepth 1 -exec rm -r ../{} \;

Offensichtlich {}wird das nicht ersetzt, denn das obige gibt

rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
...

Antwort1

Ihr findBefehl funktioniert bei mir mit GNU einwandfrei find. Wenn er auf Ihrem System nicht funktioniert, versuchen Sie Folgendes:

find . -maxdepth 1 -type d -exec sh -c 'rm -r "../$1"' Rm {} \;

Dieser Ansatz verwendet {}als unabhängiges Argument, das nicht durch geändert wird ../. Wir übergeben den Wert von {}an die Shell und die Shell wendet das an ../.

Anmerkungen:

  1. Die Reihenfolge von -maxdepth 1und -type dwurde umgekehrt, da man findempfohlen wird, globale Optionen wie -maxdepthvor Positionsoptionen wie zu definieren -type.

  2. Der Shell-Befehl muss in einfachen Anführungszeichen stehen: 'rm -r "../$1"'. Wäre er in doppelten Anführungszeichen, würde die ursprüngliche Shell ihren Wert durch ersetzen $1und der von gefundene Verzeichnisname findwürde ignoriert. Wir benötigen die aufgerufene Shell, shum die Ersetzung vorzunehmen. Die Zeichenfolge "../$1"steht in doppelten Anführungszeichen, um den Verzeichnisnamen , $1vor Worttrennung und Pfadnamenerweiterung zu schützen.

  3. Die Shell weist den String Rmzu $0. Dieser wird nicht verwendet, es sei denn, es tritt eine Fehlermeldung auf. Folglich könnte jeder beliebige String verwendet werden.

Antwort2

Mit zsh:

cd /home/michal &&
rm -rf -- Music/*(/D:t)

Der /Glob-Qualifizierer dient dazu, nur Verzeichnisse auszuwählen, Deinschließlich versteckter, und der :tModifikator wie bei der Verlaufserweiterung dient dazu, nur dieSchwanz(der Dateiname ohne den Verzeichnisteil).

Mit jeder Bourne-ähnlichen Shell:

cd /home/michal/Music &&
set -- */ &&
cd .. &&
rm -rf -- "$@"

Ein Unterschied zum Obigen besteht jedoch darin, dass auch symbolische Links zu Verzeichnissen eingeschlossen werden (und der Inhalt des Ziels anstelle des Links selbst entfernt wird).

verwandte Informationen