michahe schrieb:
Danke rklm,
Deine Lösung
Eine andere Methode, das ordentlich in einem Array zu handhaben, die sogar mit der sh
funktioniert:
verstehe ich nicht:
Beim ersten Aufruf werden keine Argumente an das Skript übergeben, dann wird der find
gestartet und der find
startet dann das Skript mit mindestens einem Argument, wenn passende Dateien gefunden werden. Dann arbeitet das Skript auf den übergebenen Dateinamen.
$0 ist der Pfad zum aktuellen Skript (das findet sich auch in der bash/sh Doku unter "Special Parameters"). "{} +" wird ersetzt durch eine Liste von Dateinamen (siehe Doku von find
). "–" ist lediglich ein Platzhalter, weil sonst der erste übergebene Name einer gefundenen Datei in $0 gespeichert und dann nicht von der for
-Schleife erfasst wird.
Ich möchte nicht einfach Code kopieren, sondern eine Lösung, die ich auch in einem Jahr noch verstehe; mein bash-Wissen ist weitaus geringer als Deines.
Das ist lobenswert.
Deshalb habe ich jetzt dieses Konstrukt, das hier korrekt funktioniert:
| clear
DateTime=$(date +%Y%m%d%H%M%S)
find "/quelle/" -name "*.odt" -ctime -42 | while read fname; do
# echo "$fname";
target="/ziel/$(basename "$fname" .odt) SICHER $DateTime.odb"
echo $target
done;
|
Da gibt es einen Sonderfall: Wenn ein Newline im Dateinamen vorkommt, funktioniert es nicht. Und, da Du nicht read -p
verwendest, geht es auch bei Backslashes im Dateinamen schief. Aber das sind nur Randfälle.