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?
warum nicht "einfach" ... -exec mkdir -p "/tmp/{}<your extension>" \; es steht nirgendwo das hinter "{}" nichts mehr kommen darf Andreas C2 General
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?
warum nicht "einfach" ... -exec mkdir -p "/tmp/{}<your extension>" \;
Wen es so einfach wäre:-( Also: test_a/ test_b/ find ./ -maxdepth 1 -type d -exec mkdir -p "/tmp/{}-Anhang" \; Ergebnis: -Anhang/ test_a-Anhang/ test_b-Anhang/ Ein "-Anhang" zu viel. Noch Ideen? Peter
Hallo, 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?
warum nicht "einfach" ... -exec mkdir -p "/tmp/{}<your extension>" \;
Wen es so einfach wäre:-(
Also: test_a/ test_b/
find ./ -maxdepth 1 -type d -exec mkdir -p "/tmp/{}-Anhang" \;
Ergebnis: -Anhang/ test_a-Anhang/ test_b-Anhang/
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: find ... -exec sh -c 'script' find-sh {} + 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 {} + Ansonsten kann in Perl das Modul File::Find helfen, damit läßt sich quasi alles machen, ist aber etwas Einarbeitung, bei der find2perl helfen kann, teils aber unnötig komplex ist und z.B. -{min,max}depth nicht kennt, das kann man aber im "wanted" einbauen oder File::Find::Rule verwenden. HTH, -dnh -- dprintk("NFSD: laundromat service - starting\n"); linux-2.6.19/fs/nfsd/nfs4state.c
Am 26.03.21 um 18:44 schrieb David Haller:
Hallo, 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. Danke Peter
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
Am 27.03.21 um 01:53 schrieb David Haller:
Am Fri, 26 Mar 2021, Peter McD schrieb:
Am 26.03.21 um 18:44 schrieb David Haller:
find ./ -mindepth 1 -maxdepth 1 -type d -exec mkdir -p "/tmp/{}-Anhang" \; ... 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 ...
Danke, geht ins Archiv. Gruß Peter
participants (3)
-
David Haller
-
Kyek, Andreas, Vodafone DE
-
Peter McD