Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Dateiliste zu Ordnernamen

neelixx / 16 Antworten / Baumansicht Nickles

Hallo,

ich habe einen Haufen an Dateien in einem Ordner, genau genommen 623 Bilddateien und 623 dazu passende PDF-Dateien. Da mir das ganze aber "etwas" unübersichtlich geworden ist, würde ich nun gerne eine Dateiliste erstellen, und anhand dieser Liste eine Ordnerstruktur aufbauen und die entsprechenden Dateien dahinein kopieren lassen.

Beispiel:

1.png
1.pdf
2.png
2.pdf
3.png
3.pdf

Nun würde ich zuerst eine Dateiliste erstellen, die alle *.pdf enthält und davon würde ich dann gerne eine Ordnerstruktur haben, also:

{Ordner 1}
{Ordner 2}
{Ordner 3}

jeweils den Dateinamen des PDFs, aber ohne die Erweiterung.
Anschließend sollte nun noch folgendes passieren, das eben die Dateien

1.png
1.pdf

in den Ordner

{Ordner 1}

kopiert werden.

Ist so etwas möglich? Und wenn ja, wie realisiere ich das?

bei Antwort benachrichtigen
Borlander neelixx „Dateiliste zu Ordnernamen“
Optionen

Batchdatei mit FOR (zum Interieren über die Dateiliste) und SET? (zum Extrahieren von Teilstrings aus dem Dateinamen). Beide Befehle geben mit dem Parameter /? eine Hilfe zurück.

Hilft Dir das schon weiter? ;-)


Gruß
Borlander

bei Antwort benachrichtigen
neelixx Borlander „Batchdatei mit FOR zum Interieren über die Dateiliste und SET? zum Extrahieren...“
Optionen

Jaha, hilft mir weiter! Allerdings den Kopf vor die Wand zu schlagen!!! :-)

Aber zwei Sachen habe ich sehr wohl verstanden:
Batchdatei
/?

OMG die Hilfe zu den beiden Befehlen ist ja mal "kurz"... *dummguck*

Ich glaub das check ich nich, kannst du mir vielleicht mit einem kleinen Beispiel dienen?

bei Antwort benachrichtigen
Aragorn75 neelixx „Jaha, hilft mir weiter! Allerdings den Kopf vor die Wand zu schlagen!!! :- Aber...“
Optionen

Klar kann dir hier jemand eine fertige Batchdatei/Anweisung schreiben, bringt dir aber nicht viel, wenn du diese nicht verstehen tust.
Spätestens wenn du mal ne kleine Änderung brauchst oder sie schnell mal auf andere Dateien/Ordner umtexten willst, wirds eng.
Kannst mal hier dich ein wenig einlesen/schauen und dann nochmal hier vorbei schauen.
Das sollte helfen ;-)

bei Antwort benachrichtigen
neelixx Aragorn75 „Klar kann dir hier jemand eine fertige Batchdatei/Anweisung schreiben, bringt...“
Optionen

Ich habe auch nicht geschrieben, das mir jemand eine ganze batch schreiben soll, ein wenig kenn ich mich schon aus, und bisher konnte ich eigentlich viele Batches die ich so gesehen habe auch ein wenig anpassen.

bei Antwort benachrichtigen
Borlander neelixx „Jaha, hilft mir weiter! Allerdings den Kopf vor die Wand zu schlagen!!! :- Aber...“
Optionen

Sorry, hier brauchst Du nur FOR.

Wird damit meine Idee klar?
for %f in (*) do echo md ordner_%~nf
for %f in (*) do echo move %f ordner_%~nf\%f


In der Hilfe von FOR wäre sollte in Deinem Fall die erste und die letzte Seite ausreichen ;-)


Gruß
Borlander

bei Antwort benachrichtigen
ChrE Borlander „Sorry, hier brauchst Du nur FOR. Wird damit meine Idee klar? for f in do echo md...“
Optionen

Hallo!

Batch Syntax sieht immer scheußlich aus...

Wie währe es denn mit etwas Python scripting:



Das Script muss in dem zu verarbeitenden Verzeichnis stehen.

Den Interpreter gibt es hier:
http://www.python.org/download/releases/2.5.4/

Gruss

ChrE
bei Antwort benachrichtigen
ChrE Nachtrag zu: „Hallo! Batch Syntax sieht immer scheußlich aus... Wie währe es denn mit etwas...“
Optionen

Hallo!

Sorry, das war wohl nichts...
Doofe Formatierung oder, wie gebe ich Quelltext aus...

Gruss

ChrE

bei Antwort benachrichtigen
ChrE Nachtrag zu: „Hallo! Sorry, das war wohl nichts... Doofe Formatierung oder, wie gebe ich...“
Optionen

Hallo!

So, hier habe ich den Quelltext mal hochgeladen:

http://codeviewer.org/view/code:72d

Ich hoffe, er bleibt eine Weile erhalten.
Fehler: Im Quelltext steht 'jpg' statt 'png'

Gruss
ChrE

bei Antwort benachrichtigen
neelixx ChrE „Hallo! So, hier habe ich den Quelltext mal hochgeladen:...“
Optionen

So, habe das ganze nun eingesetzt, wenn das Script auf das von Borlander
angesprochene Problem stößt, dann stoppt es, dann greife ich manuell ein
und lasse das Script wieder los.

Funzte nun 623 mal ganz gut, bis halt auf den kleinen Makel mit den Punkten,
auch an manchen Sonderzeichen scheint es mal gestoppt zu haben, einmal war
es z.B. eine (-Klammer.

Für die schnelle Lösung war es aber dennoch genial! Vielen Dank dafür!!! *thumbsup*

Ich werde mich aber mit Borlanders Hilfe genauer in die Batch einarbeiten,
vielleicht geht es dann auch standalone und Sonderzeichen-sicher, und vielleicht
lerne ich sogar noch was und noch vielleichterer schaffe ich vielleicht eine
funzende Batch zu schreiben. :-)

bei Antwort benachrichtigen
Borlander ChrE „Hallo! Batch Syntax sieht immer scheußlich aus... Wie währe es denn mit etwas...“
Optionen
purename=fname.split('.')[0] # extrahiere Dateinamen
Halte ich für eine gefährliche Annahme! Dateinamen können deutlich mehr als einen Punkt enthalten (bei mir tun sie das so gar relativ oft)...

Und wozu 12 Zeilen und ein zusätzlicher Interpreter, wenns Hausmittel universeller in zwei (wenn man will sicher auch in einer) Zeilen lösen können?

Gruß
Borlander
bei Antwort benachrichtigen
ChrE Borlander „ Halte ich für eine gefährliche Annahme! Dateinamen können deutlich mehr als...“
Optionen

Hallo!

> deutlich mehr als einen Punkt enthalten

Stimmt, ich habe mich an das einfache Schema "name.ext" gehalten.
Man kann natürlich auch die letzten 4 Zeichen abschneiden -> purename=fname[:-4]

Sonderzeichen sind evtl. ein Encodingproblem. Da muss ich noch mal
schauen.

> Und wozu 12 Zeilen und ein zusätzlicher Interpreter

1. weils besser zu lesen ist und evtl. zu verstehen ist?
2. weil man mit dem Interpreter und ein paar Zeilen Quelltext
noch viele andere Aufgaben lösen kann...

Gruss

ChrE

bei Antwort benachrichtigen
Borlander ChrE „Hallo! deutlich mehr als einen Punkt enthalten Stimmt, ich habe mich an das...“
Optionen

Also das Dateinamensschema 8+3 ist seit bald 15 Jahren nicht mehr aktuell. Abschneiden der letzten 4 Zeichen ist genauso gefährlich! Dateiendungen mit 4 und mehr Zeichen sind wahrlich nix exotisches mehr. Mit Prominenten Vertretern wie z.B. .html ;-)


Gruß
Borlander

bei Antwort benachrichtigen
ChrE Borlander „Also das Dateinamensschema 8 3 ist seit bald 15 Jahren nicht mehr aktuell....“
Optionen

Hallo!

Ach, sei doch nicht so kleinlich.
Hier gabs doch gar keine HTML-Dateien zu bearbeiten... ;-)
Ich habe das Programm eben nur für diesen Anwendungsfall
zurechtgebastelt.
Das mit dem Encoding ist ärgerlich.
Ich muss noch mal schauen.

Gruss

ChrE

bei Antwort benachrichtigen
REPI neelixx „Dateiliste zu Ordnernamen“
Optionen

Als kleines Bash Script (Linux) könnte man diese folgeneermaßen schnell realisieren!

#!/bin/sh
sourcedir="quelle"
targetdir="ziel"
ls -l ~/$sourcedir/*.pdf > ~/zzahl.$$
zeilenzahl=$(cat -n ~/zzahl.$$ |tail -n1 | awk '{print $1}')
zahl=1
while [ $zahl -le $zeilenzahl ]; do
mkdir ~/$targetdir/ordner$zahl
cp ~/$sourcedir/$zahl.pdf ~/$targetdir/ordner$zahl/$zahl.pdf
cp ~/$sourcedir/$zahl.jpg ~/$targetdir/ordner$zahl/$zahl.jpg
zahl=$[$zahl + 1]
done
rm ~/zzahl.$$

Leider geht die Struktur wieder etwas verloren, glaube aber, dass man es so auch lesen kann.

Man könnte das jetzt noch ausbauen, um es für wiederholte Läufe zu verwenden, indem man z.B. abfragt, ob das Zielverezeichniss schon existiert um einen Fehler bei der Wiederanlage zu vermeiden.

Statt dem cp Befehl könnte man auch den mv Befehl nutzen, dann werden die Dateien im Quellverzeichniss gelöscht.
Auch lassen sich für cp bzw. mv diverse Schalter aktivieren, mit denen man überschreiben kann oder nur Dateien gleichen Namens aber neueren Datums ersetzt usw...

Es empfiehlt sich immer, etwas Linux im Hause zu haben.
bei Antwort benachrichtigen
Borlander REPI „Als kleines Bash Script Linux könnte man diese folgeneermaßen schnell...“
Optionen
ls -l ~/$sourcedir/*.pdf > ~/zzahl.$$
zeilenzahl=$(cat -n ~/zzahl.$$ |tail -n1 | awk '{print $1}')

Die Anzahl der Dateien (um die geht es Dir ja wahrscheinlich?) kann man auch einfach mit `ls | wc -l` ermitteln ;-)
Die Zeilenzahl von ls -l ist übrigens um 1 größer als die Dateianzahl (so zumindest auf meinem System).

Bei nicht fortlaufender Nummerierung würde das Skript übrigens einige leere Ordner liefer und die letzten Dateien nicht mehr kopieren...


Gruß
bor
bei Antwort benachrichtigen
REPI Borlander „ Die Anzahl der Dateien um die geht es Dir ja wahrscheinlich? kann man auch...“
Optionen

Stimmt , ist noch einfacher! Bei mir kommt als Zeilenzahl immer die gleiche Zahl raus, wie Dateien im Verzeichnis sind. Mit unterbrochener Zahlenfolge habe ich es nicht probiert, ob dann der Script abbricht, wenn cp oder mv von der Quelle her ins Leere greifen? Man könnte ja über eine Abfrage, ob die jeweilige Datei existiert diesen Fehler ggf. auch noch abfangen!

Es empfiehlt sich immer, etwas Linux im Hause zu haben.
bei Antwort benachrichtigen