Unix-Script für spezielle Ordnererstellung etc.

kongo-otto

kongo-otto

Aktives Mitglied
Thread Starter
Dabei seit
26.12.2007
Beiträge
125
Reaktionspunkte
15
Hey Leute,

suche Lösungen für folgende Probleme. Habe hunderte von Dateien, die jeweils in separate Ordner verschoben werden sollen. Dabei soll jeder Ordner automatisch den Namen der verschobenen Datei erhalten.
Zusätzlich suche ich eine Möglichkeit, aus sehr vielen Ordnern spezielle Elemente wie z.B. jpegs zu löschen.
Weiterhin benötige ich noch eine Script, um Dateien mehrfach nach Angabe von gewissen Kriterien umzubenennen.

Könnt Ihr mir da weiterhelfen? Danke :)

Gruß kongo-otto
 
1) Verstehe ich nicht ganz.
2)
Code:
find /Pfrad/zum/Ordner/ -name *.jpeg -exec rm {} \;
3) Nach welchen Kriterien? Metadaten? Dateinamen, -endungen? Für das letzgenannte wäre 'zmv' geeigent. (Beispiel gibts auf der Homepage von maceis). Für Metadaten siehe 'mdls'.
 
  • Gefällt mir
Reaktionen: kongo-otto
1) Verstehe ich nicht ganz.
Ich bin mir auch nicht sicher, ob ich es richtig verstanden habe. ;)

@ kongo-otto
Wenn diese "hunderte Dateien" in einem Ordner "/Pfad/zum/alten/Ordner" sind, könnte ein Script so aussehen:
Code:
#!/bin/bash
for i in `ls /Pfad/zum/alten/Ordner`; do
mkdir /Pfad/zum/neuen/Ordner/$i
mv /Pfad/zum/alten/Ordner/$i /Pfad/zum/neuen/Ordner/$i
done
Dadurch werden alle Dateien im Ordner "/Pfad/zum/alten/Ordner" in einen neuen Ordner verschoben, der den gleichen Namen wie die verschobene Datei hat und im Ordner "/Pfad/zum/neuen/Ordner" liegt.
Bedingung: /Pfad/zum/alten/Ordner und /Pfad/zum/neuen/Ordner müssen unterschiedliche Ordner sein.
Eventuell testest du das zuerst mit ein paar Dummy Dateien, ob das Ergebnis dem entspricht, was du möchtest.
 
  • Gefällt mir
Reaktionen: kongo-otto
Hallo,

nochmal ein Danke für Eure Antworten.

@mobilephoner: Der Befehl funktioniert super!
@MacMännchen: Genauso habe ich es gemeint. Nimmt einem wirklich ne Menge Arbeit ab. :)

Zu meinem letzten Problem bin ich dann zu einer Lösung auf der Seite von maceis gekommen.
 
Wollte gerade einen Hinweis darauf posten :D.
Ich nehme an, Du nimmst zmv.
 
Code:
#!/bin/bash
for i in `ls /Pfad/zum/alten/Ordner`; do
mkdir /Pfad/zum/neuen/Ordner/$i
mv /Pfad/zum/alten/Ordner/$i /Pfad/zum/neuen/Ordner/$i
done
Das dürfte unter Umständen Probleme bereiten. z.B. bei Dateinamen die Leerzeihen enthalten.

Da löschen würde ich mit
Code:
rm -f $(find /Pfad/zum/Ordner/ -name *.jpeg -print)
machen das es schneller ist. Wenn allerdings leerzeichen in den Pfaden sind, dann so:
Code:
find /Pfad/zum/Ordner/ -name *.jpeg -print | xargs rm -f
Das verschieben ginge natürlich auch als Einzeiler:
Code:
find /Pfad/zum/Ordner/ -name *.jpeg -print | xargs -i mv {} /neuerPfad/zum/Ordner/
 
Ach so, fällt mir gerade ein. Auch hier ist die z-Shell wieder mal besser.
Alle Dateien (nicht Ordner) löschen unterhalb von ~/Documents, die auf 'jpeg' enden:
Code:
rm ~/Documents/**/*jpeg(.)
Verschieben:
Code:
mv ~/Documents/**/*jpeg(.) ~/Zielordner
Wesentlich kürzer und ganz ohne 'find', 'exec', 'xargs' und schon erst recht ohne Probleme mit Leerzeichen etc. :D
 
+++ sinnloses fullquoting entfernt - der zitierte Beitrag steht doch unmittelbar darüber :hamma: +++
stimmt:D

EDIT:
Danke für diese total sinnentleerende Verbesserung... :nono:
Jetzt denkt jeder das mein "stimmt" deinem edit gilt...
 
Zuletzt bearbeitet:
Das dürfte unter Umständen Probleme bereiten. z.B. bei Dateinamen die Leerzeihen enthalten.

Wohl wahr, das lässt sich aber ändern:
Code:
#!/bin/bash                                                                                                                 
ls /Pfad/zum/alten/Ordner | while read i
do
mkdir "/Pfad/zum/neuen/Ordner/$i"
mv "/Pfad/zum/alten/Ordner/$i" "/Pfad/zum/neuen/Ordner/$i"
done
Kein Einzeiler, aber es funktioniert jetzt auch mit Leerzeichen in Dateinamen.

Das verschieben ginge natürlich auch als Einzeiler:
Code:
find /Pfad/zum/Ordner/ -name *.jpeg -print | xargs -i mv {} /neuerPfad/zum/Ordner/
Das funktioniert nicht. Die Option -i kennt xargs unter OS X nicht, und die neuen Ordner existieren auch nicht.
 
Mit der for-Schleife geht es ebenfalls leerzeichensicher:
Code:
for file in ${quellordner}/*
do
mkdir "${zielordner}/$(basename ${file})" && mv $file "${zielordner}/$(basename ${file})"
done
Wenn man sich bereits im $quellordner befindet, geht es noch etwas einfacher:
Code:
for file in *
do
mkdir "${zielordner}/${file}" && mv $file "${zielordner}"
done
 
Zuletzt bearbeitet:
Das funktioniert nicht. Die Option -i kennt xargs unter OS X nicht, und die neuen Ordner existieren auch nicht.
-i ist auch tatsächlich depricated. Kennt xargs unter OSX denn -I? Leider hab ich grad kein osx hier zum selber nachschauen.
 
Zurück
Oben Unten