Hallo, Am Fri, 26 Mar 2021, Peter McD schrieb:
Am 26.03.21 um 18:44 schrieb David Haller:
Am Fri, 26 Mar 2021, Peter McD schrieb:
Am 26.03.21 um 15:27 schrieb Kyek, Andreas, Vodafone DE:
Peter McD wrote:
ich suche eine Lösung mit find Ziel: 1 - einem Set Verzeichnisse ohne Inhalt an eine andere Stelle kopieren und 2 - jedem Verzeichnis den gleichen Namen anhängen
Beispiel: test_a -> /tmp/test_a_Anhang test_b -> /tmp/test_b_Anhang
Beim ersten Teil hilft mir find. find ./ -maxdepth 1 -type d -exec mkdir -p /tmp/'{}' \;
wie könnte ich den zweiten erreichen? ... Ein "-Anhang" zu viel.
Den bekommst du wg. dem './' das auch gefunden wird. Abhilfe:
find ./ -mindepth 1 -maxdepth 1 -type d -exec mkdir -p "/tmp/{}-Anhang" \;
Generell noch ein Tip: In einem script im '-exec' kann man mehr machen, das quoting wird aber schnell eklig. Schema:
Hier also z.B.:
find ./ -mindepth 1 -maxdepth 1 -type d -exec sh -c ' for d; do mkdir -p "/tmp/${d}-Anhang"; done;' find-sh {} +
Perfekt, beides(!), der Rest ist Overkill für den Zweck.
Nimm ersteres. Der Rest war auch nur als Ergänzung gedacht. Denn der Effekt ist ja nur, neben dem mkdir je Verzeichnis noch die Shell aufzurufen. Das Muster solltest du aber wie ich dir abspeichern ;) Ich hab's z.B. als ~/find-exec-HOWTO.sh abgelegt, weil ich mir das mit dem -exec $SHELL -c 'script' $ARGV0 {} + lange nicht merken konnte. Typisch ist auch einfach -exec $SHELL -c 'script' -- {} + aber das verwirrt mich eher und das als $ARGV0 übergebene (z.B. 'find-sh') findet sich dann auch so in ps, top usw. BTW: mit einem echo mkdir wäre dir auch selbst aufgefallen, daß du das hier als Ausgabe bekommst: $ find ./ -maxdepth 1 -type d -exec echo mkdir -p "/tmp/{}-Anhang" \; mkdir -p /tmp/./-Anhang mkdir -p /tmp/./test_b-Anhang mkdir -p /tmp/./test_a-Anhang Ah, aber wo wie schon dabei sind: Merken sollte man sich auch -printf '%P\n' oder -printf '%P\0' und den Unterschied dabei zum default -printf '%p\n' und daß man das dann z.B. per find .. -printf '%P\0' | while read -r -d $'\0' name; do ... done weiterverarbeiten kann. Letzteres ist aber GNU spezifisch, AFAIR. Und '\n' als Trenner fliegt einem ggfs. um die Ohren... Direkt per STDIN an die Shell verfüttern sollte man per -printf generierte Zeilen generell nur dann, wenn man wirklich zu 100% GARANTIEREN kann, was da an die Shell verfüttert wird, auch hierzu das unvollständige Beispiel: $ find ./ -mindepth 1 -maxdepth 1 -type d -printf 'mkdir -p "/tmp/%P-Anhang"\n' mkdir -p "/tmp/test_b-Anhang" mkdir -p "/tmp/test_a-Anhang" Wie gesagt: mit passenden Dateinamen (denk an ';' und 'rm -rf /' in Dateinamen) kann das GANZ böse ins Auge gehen. -dnh -- Auch wieder richtig, aber zum bloed posten brauch ich kein Hirn. Ausserdem tipp ich schneller, als ich denke :). -- Klaus Muth