Ich habe versehentlich die Ordner in meinem Music
Verzeichnis in das übergeordnete michal
Verzeichnis 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 find
Befehl 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:
Die Reihenfolge von
-maxdepth 1
und-type d
wurde umgekehrt, daman find
empfohlen wird, globale Optionen wie-maxdepth
vor Positionsoptionen wie zu definieren-type
.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$1
und der von gefundene Verzeichnisnamefind
würde ignoriert. Wir benötigen die aufgerufene Shell,sh
um die Ersetzung vorzunehmen. Die Zeichenfolge"../$1"
steht in doppelten Anführungszeichen, um den Verzeichnisnamen ,$1
vor Worttrennung und Pfadnamenerweiterung zu schützen.Die Shell weist den String
Rm
zu$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, D
einschließlich versteckter, und der :t
Modifikator 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).