Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?
02.08.2021, 06:47:58

.
Einloggen mit Benutzername, Passwort und Sitzungslänge

Mitglieder
  • Mitglieder insgesamt: 25795
  • Letzte: batou
Statistiken
  • Beiträge insgesamt: 747855
  • Themen insgesamt: 60164
  • Heute online: 347
  • Am meisten online: 2287
  • (22.01.2020, 19:20:24)
Benutzer Online
Mitglieder: 3
Gäste: 237
Gesamt: 240

Autor Thema: [gelöst]  Dateien umsortieren - Für jede Datei einen Ordner mit dem Dateinamen anlegen  (Gelesen 1058 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Sachlage:
Ich habe in diversen Unter-Ordnern eines Hauptordners hunderte Dateien.
Die möchte ich neu sortieren, und zwar so, dass für JEDE Datei EIN Unterordner im Hauptordner angelegt wird,

Beispiel:

Daten und
Ordner jetzt:

                     ersterOrdner
                          |___  a.dat   b.dat   c.dat
                     zweiterOrdner
                          |___  d.dat   e.dat
                     dritterOrdner
                          |___  f.dat

nach dem Neuordnen:

                     aOrdner
                          |___  a.dat
                     bOrdner
                          |___  b.dat
                     cOrdner
                          |___  c.dat
                     dOrdner
                          |___  d.dat
                     eOrdner
                          |___  e.dat
                     fOrdner
                          |___  f.dat

Welche Bash-Befehle brauche ich dafür?
« Letzte Änderung: 22.06.2021, 08:13:54 von van Neel »

Zunächst die Frage nach dem Grund dieses etwas merkwürdig wirkenden Vorgehens?! Möglicherweise gibt es für das eigentlich Beabsichtigte eine bessere Lösung?
« Letzte Änderung: 15.06.2021, 14:04:27 von toffifee »

Bei den Daten handelt es sich um Filme, die ich bisher über das MediaCenter von MS genutzt habe.

Da habe ich z.B. einen Ordner Blade indem sich die drei Teile dieses Films befinden.

Jetzt bin ich auf Kodi umgestiegen, und damit Kodi die Datenbank der Filme aus dem Internet einpflegen kann, sollte wohl jeder Film in  einem eigenen Ordner liegen.
Zumindest habe ich das so gelesen.

Natürlich habe ich mehr Erfahrung mit Batch und VBS, aber da ich gerade Linux kennenlernen will, dachte ich es wäre eine gute Übung ein entsprechendes Script zu schreiben, welches mir die leidige Umkopiererei und das Erstellen jeder Menge Ordner erleichtert.

Ich hatte vergessen zu erwähnen, dass in dem Fall, die Ordnernamen dem Dateinamen ohne Endung entsprechen sollten.

Ich habe auch Kodi auf meinem Raspi und die Filme auf dem NAS in einem Ordner, da muss man keine Unterordner haben.

Also würde es reichen alle Film-Dateien sozusagen "lose" in einen Ordner zu kopieren?
Was ist mit DVD-Kopien, die ja Unterordner wie Video- und Audio-TS enthalten?

Was ist mit DVD-Kopien, die ja Unterordner wie Video- und Audio-TS enthalten?
Da kann ich nichts zu sagen, jedoch sollte man das sicher nicht weiter anfassen, sondern so belassen, wäre ja sonst extrem unübersichtlich und würde mit anderen DVD Dateien kollidieren.

Ansonsten den Rest einfach mal ausprobieren...

Die mir selbst gestellte Aufgabe habe ich zwar gelöst:
( mit Hilfe von mv, rm, ls, mkdir, und der Definition von Arrays - das waren die im ET gesuchten Befehle   ;) )

Vermutlich geht es auch einfacher ;-)
#!/bin/bash
#

i=""
pfad="/home/vanneel/Schreibtisch/test"

alleordner=( $(ls $pfad) )

for i in ${alleordner[@]}
 do
 alledateien=( $(ls $pfad/$i) )
 dateiname=( ${alledateien[@]%.*} )

  for x in ${dateiname[@]}
   do

   if ! [ -d $pfad/$x ]
    then
    mkdir $pfad/$x
   fi

   mv -f $pfad/$i/$x.* $pfad/$x/
  done

done

for i in ${alleordner[@]}
 do
 rm -r $pfad/$i
done

Aber da gibt es noch ein Problem mit dem ich nicht weiterkomme.
Wenn ich in die Ordnerstruktur noch einen Ordner "Vier ter" mit einer Datei "g h.dat" einfüge bekomme ich ein Problem mit den Leerzeichen in dem Ordner- und Dateinamen.

Ich habe schon an diversen Stellen im Script versucht das mit " zu lösen, aber das haut bisher nie hin.
Könnte mir da jemand weiterhelfen.

Ich hatte das Problem auch erst vor kurzem gehabt und folgende Erfahrung gemacht:

  • Selbst wenn es hunderte Ordner sind, ist man immer noch schneller "händisch", bevor das Script endlich (fehlerfrei) fertig ist
  • Je nach Scraper im Kodi eh' Deine Ordnernamen dann wieder nicht passen, weil es dann wieder eigene Regeln gibt.

Nachtrag: Mach mal, soweit Du kommst, und dann lass den Scraper Deiner Wahl darüber laufen und "bessere" nach. Dann wächst Dein Ding stetig und wird laufend besser! Noch ein Tipp am Rande: willst Du dennoch Unterordner, über die dann der Scraper nicht stolpert, verwende ein Sonderzeichen. Also z.B. soll es einen Überordner "Fluch der Karibik" geben, hast Du das Problem, dass es auch einen Unterordner "Fluch der Karibik" gibt, in dem halt auch die *.vob Dateien liegen. Benenne also den Überordner "#Fluch der Karibik", dann findet ihn der Scraper nicht.
« Letzte Änderung: 21.06.2021, 14:44:39 von marcco134 »

@van Neel:
Machst Du das auf einem Linux-Dateisystem?

Ich hatte das Problem auch erst vor kurzem gehabt und folgende Erfahrung gemacht:
...
  • Selbst wenn es hunderte Ordner sind, ist man immer noch schneller "händisch", bevor das Script endlich (fehlerfrei) fertig ist
...
...
Machst Du das auf einem Linux-Dateisystem?

Wenn ich das mache, dann erst wenn das ganze sicher funktioniert, das ist klar. Und natürlich kann ich es auch, da eh nur einmal nötig händisch machen.
Aber ich bin Linux-Newbie und will Grundlagen des Bash-Scirtings lernen. deshalb ist es eine "übungs-Aufgabe" für mich. Sozusagen Training für die grauen Zellen. Der Zeitaufwand ist mir egal, davon habe ich genug.

Die Daten sind jetzt auf einer NTFS-Datenfestplatte. Aber vielleicht stelle ich den dazugehörenden Windows 10 Pro Rechner, der nur als MedienCenter läuft, später mal  auf Linux um.

Ich bin jetzt auf die Möglichkeit gestossen, das Trennsymbol für den ls-Befehl durch setzen der Variabel IFS zu ändern.
Ich habe statt eines Leerzeichens einen Zeilenumbruch gewählt.

#!/bin/bash
#

i=""
x=""
pfad="/home/vanneel/Schreibtisch/test"
BackupIFS="$IFS"
IFS=$(echo -en "\n\b")

alleordner=( $(ls $pfad) )

for i in ${alleordner[@]}
 do
 alledateien=( $(ls $pfad/$i) )
 dateiname=( ${alledateien[@]%.*} )

  for x in ${dateiname[@]}
   do

   if ! [ -d $pfad/$x ]
    then
    mkdir $pfad/$x
   fi

   mv -f $pfad/$i/$x.* $pfad/$x/
  done

done

for i in ${alleordner[@]}
 do
 rm -r $pfad/$i
done

IFS="$BackupIFS"


Damit funktioniert das Script erst einmal für die gewünschte Übung.
Vielen Dank an alle. Das Thema ist für mich erledigt.

Um das Script auf die von mir erwähnte Film-HD los zu lassen, habe ich es noch etwas angepasst.
Ich will ja evtl. DVD-Kopien nicht verschieben, geschweige denn löschen.

#!/bin/bash
#

i=""
x=""
pfad="/home/vanneel/Schreibtisch/test"
BackupIFS="$IFS"
IFS=$(echo -en "\n\b")

alleordner=( $(ls $pfad) )
for i in ${alleordner[@]}
  do
    alledateien=( $(ls $pfad/$i) )
    dateiname=( ${alledateien[@]%.*} )
    for x in ${dateiname[@]}
      do
        if [[ "$x" != "Video_TS" ]] && [[ "$x" != "Audio_TS" ]]
          then
          if ! [ -d $pfad/$x ]
            then
            mkdir $pfad/$x
          fi
          mv -f $pfad/$i/$x.* $pfad/$x/
        fi
     done
done

cd $pfad
find . -type d -empty -exec rmdir {} \;

IFS="$BackupIFS"
« Letzte Änderung: 25.06.2021, 07:33:01 von van Neel »

Kleine Anmerkung zu deinem Code: Ich höre immer wieder, dass die Ausgabe von "ls" nicht verlässlich ist. Deswegen verwende ich an der Stelle
for i in $PFAD
do ..

oder für Ordner
for ORDNER in $(find "$PFAD" -iname "$SUCHBEGRIFF" -type d)
do ..

Ich bin Newbie deshalb die Frage:
Was genau heißt "ls ist unzuverlässig"?

Ich denke, Slangbein will darauf hinweisen, dass nicht jedes Terminalkommando, wie z.B. "ls", in jedem Fall genau so auch in einem Bash-Script funktionieren muss.