rklm schrieb:
Viel schwerwiegender ist aber, dass der grep hier auch an der falschen Stelle steht, da man die Liste der Dateinamen, die find liefert, überhaupt nicht filtern will. Deshalb wird ja in meinem Beispiel erst der cp ausgeführt und dann per -printf ein Zeichen pro Datei ausgegeben und schließlich schaut der fgrep nach, ob mindestens ein Zeichen gekommen ist.
An sich ist das ja auch kein Filter, es werden ja alle find-Ergebnisse durchgelassen, es sei denn, man hätte Dateinamen wie "–./&&&#+++", d.h. ohne Buchstaben und Zahlen. Aber das ist ja ausgeschlossen:
Solche Annahmen sollte man nicht machen, wenn ohne sie eine ebenso einfache aber robustere Lösung zu erreichen ist. Wenn das Skript, das ja immer funktioniert hat, mal in einem anderen Zusammenhang eingesetzt wird oder doch jemand auf die Idee kommt, dort eine Datei abzulegen, die entsprechende Zeichen im Namen enthält, geht es u.U. auf einmal nicht mehr. Und vielleicht merkt man es noch nicht einmal. Ich weiß, wie vergesslich ich bin, und ob ich in der Situation überhaupt auf die Idee käme danach zu schauen, ist zweifelhaft. ☺
Es gibt dazu auch eine schöne Regel: Be liberal in what you accept, and conservative in what you send.
WinXP to Edgy schrieb:
in einem größeren Archiv, unterteilt nach Jahresordnern, sind Dokumente abgelegt, welche ein Datum sowie zwei bis drei Schlüsselworte im Namen enthalten.
Nun ja, diese Formulierung, die ja keine präzise Spezifikation ist, würde auch z.B. Leerzeichen zwischen den "Schlüsselworten" erlauben.
Mit grep wird nur getestet, ob die Ausgabe von find ein Leerstring ist, was ja sinnvoll ist, da
Dafür reicht auch ein grep .
.
Der grep lässt sich noch optimieren:
1
find dir/ -name "*$d*" -type f -print0 | grep -z "^." | xargs -r0 -I{} cp -au {} .;
Genau das hatte ich gemeint.
Ciao
robert