• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Ordner automatisch erstellen

compi

Member
Hi ich habe mal wieder ein Problem.

Ich möchte ein wenig Ordnung schaffen.

Ausgangssituation:
Ich habe in einem Ordner viele Filme und möchte diese nun in einen Unterordner packen.

Also ich habe jeden Film als $NAME.mpeg und eine Cover dazu $Name.jpg und nun möchte ich jeden Film in einem eigenen Unterordner mit $NAME


VIDEOS
+Film1.mpeg
+Film1.jpg
+Film2.mpeg
+Film2.jpg
+Film3.mpeg
+Film3.jpg

Danach sollte es so aussehen


VIDEOS
+Film1
+-Film1.mpeg
+-Film1.jpg
+Film2
+-Film2.mpeg
+-Film2.jpg
+Film3
+-Film3.mpeg
+-Film3.jpg


Ich danke euch für eure Hilfe!
 

P6CNAT

Advanced Hacker
Hi,

ich schlage folgendes Script vor:

Code:
for datei in `ls *.mpeg` 
do
  # Name extrahieren
  name=`echo $datei | awk '{FS="."; print $1}'`
  # Verzeichnis anlegen
  mkdir $name
  # Dateien verschieben
  mv ${name}.mpeg $name
  mv ${name}.jpg  $name
done

Gruß
Georg
 
A

Anonymous

Gast
P6CNAT schrieb:
ich schlage folgendes Script vor:
vom Prinzip her sollte das schon so gehen, wie P6CNAT das hier vorschlägt, ist aber riskant. Spätestens wenn dort noch mehr Punkte in den Dateinamen zu finden währen. Auch gegen Leerzeichen und andere Sonderzeichen ist das überhaupt nicht abgesichert.
Die mv Befehle würden schon vorhandene Dateien knadenlos in der Nirvana schicken.

Von solchen Datein, die einen nicht ganz unbedeutenden Speicherverbrauch haben, hat man in den meisten Fällen nicht allzuviele Backups und Kopien. Wenn hier irgend was schief läuft, sei es wegen Scriptfehler, irgendwelcher Sonder-oder Leerzeichen in Dateinamen oder ähnlichen, gibts dann mit einiger Wahrscheinlichkeit ein bischen Schwund. ;)

Bei solchen Daten und Scipten immer erstmal mit echo die enscheidenden Befehle ausdrucken lassen, und die Ausgabe genauer anschauen, eh man sie wirklich scharf laufen läßt.

robi
 
OP
C

compi

Member
Danke.

Kann man nicht einfach bei der

name=`echo $datei | (.mpeg abschneiden)

Gruß

compi
 

P6CNAT

Advanced Hacker
Hallo robi,

danke für den 'Beipackzettel' mit der Warnung vor Risiken und Nebenwirkungen.

Robi hat völlig Recht. Dieses Miniscript behandelt nur den Idealfall.
Mit Absicherung von Sonderfällen oder Rücksicht auf Sonderzeichen im Filenamen kann so ein Script schnell mehrere hundert Zeilen lang werden. An Filenamen mit Leerzeichen habe ich mit in Shellscripten schon vergeblich bemüht, weil die Namen in do-Schleifen gerne in Einzelteile zerlegt werden.

Gruß
Georg
 

P6CNAT

Advanced Hacker
Hallo compi,

compi schrieb:
Kann man nicht einfach bei der

name=`echo $datei | (.mpeg abschneiden)

ja in Kombination mit sed

Code:
name=`echo $datei | sed "s/.mpeg//g"`

Es kann sein, dass man den . maskieren muss also sed "s/\.mpeg//g", beim schnellen Test ging es ohne.

Gruß
Georg
 
OP
C

compi

Member
Vielen Dank.

Kannst du mir noch beim Problem mit den Leerzeichen im Dateinamen helfen?

Gruß
compi
 

P6CNAT

Advanced Hacker
Hallo compi,

Zeichenketten werden in den Shell Scriptsprachen wie Streams verarbeitet, wobei ein Leerzeichen als Trenner zwischen Daten gilt. Zur Verarbeitung muss man die Leerzeichen maskieren, das kann aber sehr tricky werden. Mir ist es jedenfalls noch nicht gelungen in komplexen Scripten Leerzeichen in Dateinamen richtig zu verarbeiten.

Wenn es möglich ist würde ich die Leerzeichen vor der weiteren Verarbeitung in Unterstriche umwandeln. Das kann man so machen:

Code:
# Alle Dateinamen in einer Liste einsammeln
ls -1 > liste.txt
# In einer Schleife über die Liste Leerzeichen aus den Filenamen entfernen
while read filename
do
  filename_new=`echo $filename | sed "s/ /_/g"`
  if [ "$filename" != "$filename_new"  ]
  then
    echo "mv '$filename' '$filename_new'"
    mv "$filename" "$filename_new"
  fi
done < liste.txt

Gruß
Georg
 

P6CNAT

Advanced Hacker
Hallo,

bezüglich meines Vorschlages vom 2010-Mai-12, 19:02
Code:
  :
  # Name extrahieren
  name=`echo $datei | awk '{FS="."; print $1}'`
  :
habe heute ich heute mal wieder festgestellt, dass es verschiedene Funktionalitäten von awk gibt.

Code:
  ># Das funktioniert unter diversen Unix-Varianten, aber nicht unter OpenSuse
  > echo "a_b" | awk '{FS="_"; print $1}'`
  > a_b

  ># Die Variante müsste immer funktionieren
  > echo "a_b" | awk 'BEGIN {FS="_"} {print $1}'`
  > a

also immer schön testen, bevor ihr wertvolle Daten schreddert!

Gruß
Georg
 
Oben