ubuntuusers.de

Ordner nach Dateinamen erstellen und Datei hineinverschieben

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Simaryp

Anmeldungsdatum:
24. Mai 2008

Beiträge: 211

Hi, ich hab nicht wirklich viel Erfahrung mit Programmieren und so ziemlich keine mit Shell Skripts.

Ich habe nen Ordner mit vielen Dateien, für xmbc wäre es super, wie ich las, wenn ich die Dateien jeweils in einem Unterordner hätte, der so hieße wie jetzt die Dateien. Ich dachte mir, dass geht doch bestimmt super mit nem Shell Skript.

Das müsste halt in dem entsprechenden Ordner alle Dateien durchgehen und jeweils mit mkdir einen Ordner diesen Names erstellen und anschließend die Datei hinein verschieben. Also Pseudotext mäßig sowas wie:

1
2
3
4
for file in /home/video
   mkdir /home/video/filename(file)
   mv file /filename
end

Kann mir jemand sagen, ob das zu einfach gedacht ist. Und wie die Befehle für die Shell genau heißen?

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21918

Wohnort: Lorchhausen im schönen Rheingau

Fast gut. Dir fehlen nur die Shellbasics, für die du dir ein oder zwei Tutorials durchlesen solltest. track hat glaub in seinen Beiträgen immer wieder ein paar gute auf Lager 😉

  1. Eine for-schleife in der Shell wird von do und done begrenzt

  2. Variablen werden mit $ gekennzeichnet

  3. Aufrufe von Dateinamen sollten gequoted werden, um Fehler durch Leerzeichen auszuschließen

In Rohform also:

1
2
3
4
5
6
7
8
#!/bin/bash
pfad=/home/video
for file in $pfad
do
  filename="${file%.*}"  ## Dateinamen ohne suffix ermitteln
  mkdir -p $pfad/"$filename" ## Verzeichnis erstellen
  mv "$file" $pfad/"$filename" ## Verschieben
done

Bitte zuerst auf ein paar Testdaten loslassen, den Pfad kannste ja leicht ändern

Simaryp

(Themenstarter)

Anmeldungsdatum:
24. Mai 2008

Beiträge: 211

Cool Danke

Da ist noch ein bischen der Wurm drin. Ich habe hinter $pfad noch ein /*.* gemacht. Sonst hat er nicht die Dateien im Pfad sonder nur den Ordner Videos behandelt. Das Problem ist aber noch, dass er als filename den ganzen Pfad nimmt. Dadurch wird dann in Videos ein Ordner home angelegt usw. Außerdem hat das mit den Dateiendungen auch nicht funktioniert. Die sind in den Ordnern dann enthalten.

1
2
3
4
5
6
7
8
#!/bin/bash
pfad=/home/jacob/Videos
for file in $pfad/*.*
do
	filename="${file%_*}"
	mkdir -p $pfad/"$filename"
	mv "$file" $pfad/"$filename"
done

Edit:

So jetzt funktioniert es, habe den fehler mit dem . und _ selbst gefunden und auch das Problem mit dem Pfad gelöst.

1
2
3
4
5
6
7
8
9
#!/bin/bash
pfad=/home/jacob/Videos
for file in $pfad/*.*
do
	filename_1="${file%.*}"
	filename="${filename_1##*/}"
	mkdir -p $pfad/"$filename"
	mv "$file" $pfad/"$filename"
done

So funktioniert das jetzt scheinbar ohne Probleme bei drei Dateien mit Leerzeichen etc. Informatik ist schon cool.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13353

Simaryp schrieb:

So jetzt funktioniert es, habe den fehler mit dem . und _ selbst gefunden und auch das Problem mit dem Pfad gelöst.

1
2
3
4
5
6
7
8
9
#!/bin/bash
pfad=/home/jacob/Videos
for file in $pfad/*.*
do
	filename_1="${file%.*}"
	filename="${filename_1##*/}"
	mkdir -p $pfad/"$filename"
	mv "$file" $pfad/"$filename"
done

So funktioniert das jetzt scheinbar ohne Probleme bei drei Dateien mit Leerzeichen etc.

Du kannst es Dir noch etwas einfacher machen:

  • Das Abschneiden des Pfades nur um ihn direkt danach wieder davor zu packen ist umständlich.

  • Als Ziel für den mv reicht als Angabe das Verzeichnis, denn Du willst die Dateien ja nicht umbenennen.

1
2
3
4
5
for file in /home/jacob/Videos/*.*
do
  dir="${file%.*}"
  mkdir -p "$dir" && mv "$file" "$dir"
done

Informatik ist schon cool.

Nun ja, ich würde das eher "Programmieren" nennen. Informatik ist ja noch so viel mehr.

Ciao

robert

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21918

Wohnort: Lorchhausen im schönen Rheingau

rklm schrieb:

  • Als Ziel für den mv reicht als Angabe das Verzeichnis, denn Du willst die Dateien ja nicht umbenennen.

Hups, so wollte ich da auch schreiben, aber da scheint der Editierteufel dazwischengekommen zu sein 😀

Antworten |