cp- eine Datei in mehrere Ordner kopieren

Und noch einmal grabe ich das Thema aus.

Was bisher gut funktioniert (falls jemand mit der Suchfunktion darauf stößt):

- In Verzeichnis x liegen viele Verzeichnisse mit Leerzeichen in den Benennungen.
- Im Verzeichnis y liegen "info.txt" und ein leeres Verzeichnis "ORIGINAL".

- info.txt wird in alle Verzeichnisse in x kopiert, aber nicht in möglicherweise vorhandene Unterverzeichnisse:

Code:
find . -type d -mindepth 1 -maxdepth 1 -exec cp -p ../y/info.txt {} \;

- Das Verzeichnis "ORIGINAL" wird ebenfalls in alle Verzeichnisse in x kopiert. - Wieder nur Level 1:

Code:
find . -type d -mindepth 1 -maxdepth 1 -exec cp -r ../y/ORIGINAL {} \;

aber jetzt hänge ich fest:
Jedes einzelne Verzeichnis unter x beinhaltet ein Verzeichnis "ORIGINAL" und .mp3 Dateien:

47k2ysxd.jpg

Diese mp3s sollen in das jeweilige "ORIGINAL" verschoben werden.

Aus Gründen, die mir verborgen bleiben, funktioniert das hier nicht:

Code:
find . -type d -mindepth 1 -maxdepth 1 -exec mv {}/*.mp3 {}/ORIGINAL \;


Lege ich testweise mp3 Dateien direkt in x und gebe das hier ein (Also OHNE {}/ vor dem *.mp3):

Code:
find . -type d -mindepth 1 -maxdepth 1 -exec mv *.mp3 {}/ORIGINAL \;

dann werden diese Testfiles in das Verzeichnis ORIGINAL des ersten Verzeichnisses in x verschoben. - Danach gibt es natürlich Fehler, weil nix mehr da ist zum Verschieben, aber grundsätzlich passiert genau das was passieren soll. Warum dann nicht auch MIT {}/ vor dem *.mp3?
Als Rückmeldung kommt:
zsh: no matches found: {}/*.mp3
 
Code:
find . -type d -mindepth 1 -maxdepth 1 -exec mv {}/*.mp3 {}/ORIGINAL \;
[..]
dann werden diese Testfiles in das Verzeichnis ORIGINAL des ersten Verzeichnisses in x verschoben. - Danach gibt es natürlich Fehler, weil nix mehr da ist zum Verschieben, aber grundsätzlich passiert genau das was passieren soll. Warum dann nicht auch MIT {}/ vor dem *.mp3?
Als Rückmeldung kommt:
zsh: no matches found: {}/*.mp3

Wenn die Shell keine Dateien findet, die dem gegeben Globbing Pattern entspricht (dein Term mit dem Asterisk *), lässt sie es unexpandiert. Die Befehle selbst führen keine Globbing Expansionen aus, sondern verlassen sich auf die Shell dies schon getan zu haben. Somit bekommt mv innerhalb deines exec also das Argument {}/*.mp3 geliefert und kann damit nichts anfangen.

Du kannst also direkt mit -exec keine shell built-ins, functions, pipelines oder eben globbings nutzen, außer die wrapp'st es in etwas wie eine child shell mittels sh -c.

Code:
 xentric@ e1231l-xentric ~/testtttt/x 1091
 $ tree
.
├── Ordner 1
│   ├── Datei 1.mp3
│   ├── Datei 2.mp3
│   └── ORIGINAL
└── Ordner 2
    ├── Datei 1.mp3
    ├── Datei 2.mp3
    └── ORIGINAL

4 directories, 4 files
 xentric@ e1231l-xentric ~/testtttt/x 1092
 $ find . -mindepth 1 -maxdepth 1 -type d -exec sh -c 'mv "{}"/*.mp3 "{}"/ORIGINAL/' \;
 xentric@ e1231l-xentric ~/testtttt/x 1093
 $ tree
.
├── Ordner 1
│   └── ORIGINAL
│       ├── Datei 1.mp3
│       └── Datei 2.mp3
└── Ordner 2
    └── ORIGINAL
        ├── Datei 1.mp3
        └── Datei 2.mp3

4 directories, 4 files
 xentric@ e1231l-xentric ~/testtttt/x 1094

http://tldp.org/LDP/abs/html/globbingref.html
 
  • Gefällt mir
Reaktionen: mj, MiBSuM und dg2rbf
Wow! Das ist nichts auf das ich von selbst gekommen wäre! Von gobbing hatte ich vorher nie gehört. Das Ganze unterzuvergeben ist ziemlich clever. Vielen Dank!
 
Zurück
Oben Unten