Will man Dateien, die sich per find
finden lassen, in ein anderes Verzeichnis verschieben, gelingt das nur mit ein paar kleinen Tricks.
Beispielsweise sollen in einem Doku-Wiki-Verzeichnis alle zu foo.txt
gehörenden Dateien in das Unterverzeichnis bar
verschoben werden (wobei die entspr. bar
-Verzeichnisse bereits existieren). Man denk natürlich zunächst an so was:
find . -name "foo*" -exec mv "{} `dirname {}`/bar/`basename {}`" ;
Leider funktioniert das so nicht, weil dirname {}
nur . (einen Punkt) zurück liefert.
Nun kann man dirname
ja durch ${VAR%/*}
ersetzen, aber das funktioniert mit find
nur in einer Sub-Shell:
find . -name "foo*" -ok sh -c 'mv -v $0 ${0%/*}/bar/${0##*/}' {} ;
Das funktioniert und dank -ok
statt -exec
fragt find
vor jeder Befehlsausführung, ob das tatsächlich gemacht werden soll. Dabei fällt dann auf, dass find
auch gerne die gerade eben verschobene Datei nochmal verschieben möchte. Um das zu verhindern, muss der Zielpfad ausgeklammert werden. Das gelingt so:
find . -name "foo*" -not -path '*/bar/*' -ok sh -c 'mv -v $0 ${0%/*}/bar/${0##*/}' {} ;