massenverschiebung

hoernchen

hoernchen

UBERgarstiges nagetier
hallo,

wuerde das folgende skript so funktionieren ?

for i in $(find / -iname "*.ogg"); do mv $i /mnt/musik/; done

sprich es soll alle ogg-dateien die gefunden werden in ein bestimmtes verzeichnis schupfen.
hab im moment leider keine testmoeglichkeit (außer ich mißbrauchte den sql-server neben mir und das will ich nicht unbedingt).
 
ich würd's so machen, sonst kann es probleme geben mit filenamen die leerzeichen enthalten
Code:
find / -iname "*.ogg" | while read file; do mv "$file" /mnt/musik/; done
 
Du kannst auch find direkt die mv-Anweisung geben:
Code:
find / -iname "*.ogg" -exec mv {} /mnt/musik/ \;
Klappte bei einem schnellen Test auch mit Dateien mit Leerzeichen.
 
erstmal danke, ich probiers dann daheim.

@rikola : so hatte ich das schonmal, und da gings aber nicht, sprich es tat sich nichts !
 
hoernchen schrieb:
erstmal danke, ich probiers dann daheim.

@rikola : so hatte ich das schonmal, und da gings aber nicht, sprich es tat sich nichts !

Wie tat sich nix? Rikolas Beispiel ist syntaktisch richtig. Was gibt

Code:
find / -iname "*.ogg" -exec echo mv {} /mnt/musik/ \;

aus?
 
bei rikola's command besteht nur die gefahr dass find auch die ogg dateien findet die es eben selbst nach /mnt/musik/ verschoben hat. kein beinbruch, aber auch nicht schön
 
Dann muss man '/mnt/musik' bei find ausschliessen:

Code:
find / -path "/mnt/musik" -prune -o -iname "*.ogg" -exec echo mv {} /mnt/musik/ \;

Gruss Phorus

edit:Hast Recht Ninguno. Hab anfänglich nicht gesehen, dass von / aus gesucht wird, dann gibts natürlich Seiteneffekte, wenn man /mnt/musik nicht ausschliesst.
 
Zuletzt bearbeitet:
Hallo
Da kann man aber nur hoffen, dass die Anzahl der Dateien nicht zu groß wird.
Pro Datei ein Prozeß!
Sonst muss entweder eine Schleife her, oder xargs. ;)

Gruß Wolfgang
 
man find:
Code:
...
 -exec utility [argument ...] ;
             True if the program named utility returns a zero value as its
             exit status...

man mv:
Code:
EXIT STATUS
     The mv utility exits 0 on success, and >0 if an error occurs.

Also find wartet bei der Weitersuche, bis der exec-Befehl erfolgreich ausgeführt wurde. Als Beispiel (in zwei verschiedenen Shells):

shell1:
Code:
ps ax | grep mv | grep -v find | grep -v grep | wc -l      #liefert 0

shell2:
Code:
find multimedia/ -iname "*.mp3" -exec mv {} test \;

shell1 (während längerem Lauf von find):
Code:
ps ax | grep mv | grep -v find | grep -v grep | wc -l      #liefert 1

Gruss, Phorus
 
@ wolfgang:

Ich dachte, Du meinst find startet haufenweise parallele Prozesse (was es ja wohl nicht macht). Kannst Du mir bitte den Unterschied zwischen "find -exec.." und "find .. | xargs -n1..." erklären? :)
 
Hallo
Ganz kurz:
der -exec bekommt die gesamten Argumente von find komplett übergeben.
Der -exec Befehl startet nun für diese Liste (je mach Befehl) pro Argument oder für alle zusammen einen Prozeß.

Wenn die Liste nun sehr lang ist, bekommst du unter Umständen die Fehlermeldung:
Argumentlist too long...
Mit xargs kannst du die Anzahl der übergebenen Argumente festlegen.
Option -n[NUM].
Besonders in Verbindung mit möglichen unmöglichen Dateinamen, wie sie in einem (hier nicht erwähnten ) OS sehr beliebt sind, macht sich die Kombination aus
find /path -name "*foo" -print0|xargs -0 -n1 rm
sehr gut.
Hier wird als Trennzeichen \0 verwendet, was alle Dateinamen mit sämtlichen Bad-Char als jeweils ein (siehe -n1) Argument übergibt.
Der zweite Vorteil ist, dass die Argumentliste nicht zu lang wird.

Gruß Wolfgang
PS Ja, hatte mich etwas unglücklich ausgedrückt.
 
soda, habs endlich ausprobiert. rikolas loesung hat funktioniert. mein fehler damals war daas fehlende "\" am schluß.
es gab immer nur einen prozeß pro verschieben auf einmal, also keine anhaeufung.

auf jeden fall ganz viel danke an alle !
 

Ähnliche Themen

Suchen und Ersetzen mit regulärem Ausdruck

Keine grafische Oberfläche (Debian Installation)

[gelöst] - for file in ... nur für bestimmte Endungen?

Summe von Zahlen in einer Zeilen bilden

Benötige Hilfe- Dateien vergleichen

Zurück
Oben