Dateinamen zerlegen?

4 Antworten

Hallo

Also soll das Programm den Namen nach jeder Leerstelle aufsplitten.

So z.B. für den Namen:

NAME=$(echo "Urlaubs_Bild245 2018 Frankreich.jpg"|awk '{print $1}')
echo $NAME
Urlaubs_Bild245

und so für das Jahr:

JAHR=$(echo "Urlaubs_Bild245 2018 Frankreich.jpg"|awk '{print $2}')
echo $JAHR
2018

und hier für das Land:

LAND=$(echo "Urlaubs_Bild245 2018 Frankreich.jpg"|awk '{print $3}'|sed 's/.jpg//')
echo $LAND
Frankreich

oder so:

echo "Urlaubs_Bild245 2018 Frankreich.jpg"|cut -d' ' -f1
echo "Urlaubs_Bild245 2018 Frankreich.jpg"|cut -d' ' -f2
echo "Urlaubs_Bild245 2018 Frankreich.jpg"|cut -d' ' -f3|sed 's/.jpg//'

awk hat den Vorteil das es mit Tabulatoren oder mehreren Leerzeichen im Dateinamen keine Probleme hat im Gegensatz zu cut.

Also soll das Programm den Namen nach jeder Leerstelle aufsplitten.

Da hast Du jetzt Lösungsansätze.

Wäre das irgendwie möglich, auch wenn die einzelnen Teile bei versch. Bildern unterschiedlich lang sein können?

Solange als Trenner zwischen den Bestandteilen immer Leerstellen sind ist das egal, sind aber mehrere Leerzeichen: Urlaubs_Bild245 2018 08 16 Frankreich.jpg dann würden beide Lösungswege logischerweise falsche Ergebnisse liefern.

Allerdings solltest Du für eine Reihe von Namen eine Schleife laufen lassen:

for i in $(ls -1 /home/$USER/Bilder); do echo "$i | awk '{print $1}'"

Linuxhase

Woher ich das weiß:eigene Erfahrung – Ich benutze seit 2007 Linux und habe LPIC101 und LPIC102

basti1817 
Fragesteller
 17.08.2019, 00:26

Danke dir für den Lösungsweg. Ich habe das jetzt so schon mit cut gemacht und für den ersten Tag wird die Liste gefüllt. Die Listen danach bleiben aber leer. Unter dem Kommentar von "guenterhalt" ,auch bei dieser Frage, habe ich es nochmal genauer beschrieben. Kannst du mir dabei vielleicht noch weiterhelfen?

0

so etwas mach ich mit einem Tcl-Script

die zugehörige Shell ( tclsh) sollte in den gängigen Distributionen bereits installiert sein.

Mit

set list [ split <name> ]

erhält man eine Liste der einzelnen Teile, so wie du das willst.

mit

set was [lindex $list 0 ]

set wann [lindex $list 1 ]

set wo [lindex $list 2 ]

steht in was "Urlaubs_Bild245,
in
wann steht 2018
und in wo
steht
Frankreich.jpg

was wann wo sind interne Variablen, die man nutzen kann, um die Bilder auf verschiedene Verzeichnisse zu "verteilen"

Helfe gern weiter.

Woher ich das weiß:Berufserfahrung – openSuSE seit 1995

basti1817 
Fragesteller
 16.08.2019, 23:49

Danke dir für die Antwort ich habe wegen einer früheren Antwort das ganze aber auch in der Bash Shell hinbekommen. Zwar wohl umständlicher aber ich bleibe jetzt dabei da ich es ja schon habe. Trotzdem danke und in Zukunft werde ich dann vllt. auf diese Methode zurückgreifen

0
basti1817 
Fragesteller
 16.08.2019, 23:56

Jetzt habe ich aber doch noch eine Frage:

Ich habe das jetzt mit dem cut befehl gemacht und der erste Tag wird auch immer in einer Liste gespeichert. Alle darauffolgenden Listen werden zwar erstellt, bleiben aber leer. Hier ein Code Ausschnitt:

while read line
do

tr -s ' ' | cut -d ' ' -f 3 > /home/mephisto/Downloads/Videos/files/sorted/cut/mp4/files_mp4_1.txt &&

cut -d" " -f 4 > /home/mephisto/Downloads/Videos/files/sorted/cut/mp4/files_mp4_2.txt &&

cut -d" " -f 5 > /home/mephisto/Downloads/Videos/files/sorted/cut/mp4/files_mp4_3.txt &&

cut -d" " -f 6 > /home/mephisto/Downloads/Videos/files/sorted/cut/mp4/files_mp4_4.txt

done < /home/mephisto/Downloads/Videos/files/sorted/files_mp4.txt

Der Code lässt sich ausführen aber nur die erste Zeile wird ausgeführt. Woran könnte das liegen?

0
AncheCameo  17.08.2019, 08:38
@basti1817

Mich wundert, dass die erste Zeile überhaupt ausgeführt wird. Bei einer while-read-Schleife müssen die Daten irgendwo her kommen, dabei ist line die Variable, welche die jeweilige Zeile des Durchgangs enthält. Also eher:

echo $line | cut -d" " -f4 >> /home/mephisto/Downloads/Videos/files/sorted/cut/mp4/files_mp4_2.txt &&

Genauso würde ich auch die erste Zeile aufbauen, denn, wie gesagt, ich weiß nicht, wo sonst die Daten herkommen. Achte auch auf das doppelte Umleitungssymbol, sonst werden die Zeilen in den Ausgabedateien nicht angehängt, sondern der neue Eintrag ersetzt den alten. Das willst du sicher auch nicht.

0
Linuxhase  17.08.2019, 08:48
@basti1817
Der Code lässt sich ausführen aber nur die erste Zeile wird ausgeführt. Woran könnte das liegen?

Um das testen zu können bräuchten wir aber schon den Inhalt, sagen wir mal 10 bis 15 Zeilen, der <eingabe-datei> um zu sehen was überhaupt bearbeitet wird.

Offenbar soll tr -s ' ' mehrfach hintereinander vorkommende Leerzeichen entfernen, nur woraus denn, Du gibst ja nur an wohin die Ausgabe gespeichert werden soll. Das ist doch hoffentlich nicht die gleiche Datei oder!?

----------------------------------------------------------------------------------------------------------------------------------------

Gehe ich recht in der Annahme das Du zunächst nicht die Dateien bzw. Dateinamen selbst verändern möchtest sondern die fünf Dateien:

  • files_mp4,txt
  • Dateifiles_mp4_1.txt
  • Dateifiles_mp4_2.txt
  • Dateifiles_mp4_3.txt
  • Dateifiles_mp4_4.txt

anlegen willst bzw. die files_mp4,txt die eigentliche Datei zum auslesen ist?

----------------------------------------------------------------------------------------------------------------------------------------

  1. Was steht also in files_mp4,txt
  2. Was soll in die anderen Dateien geschrieben werden?

Weil aktuell verwendest D nur die einfache Ausgabeumleitung ">" mit der der Inhalt immer überschrieben wird, so das nur eine String da steht. Andererseits würden ja eventuell mehrere Zeilen den gleichen string enthalten, worin ich nun gar keinen Sinn erkennen kann.

Linuxhase

1
Linuxhase  17.08.2019, 09:37
@Linuxhase

BTW: bitte mach für dieses Thema eine neue Frage auf, denn Du kommst hier erst mit Bildern und nun geht es um Filme und nicht um die Dateinamen sondern um eine Liste

0
basti1817 
Fragesteller
 17.08.2019, 13:45
@AncheCameo

Die txt Datei woher die Zeilen kommen steht nach dem "done"

Hier der Syntax:

while read line           
do           
    command           
done <file
0
AncheCameo  17.08.2019, 13:51
@basti1817

Richtig, die Logik ist aber, dass die Schleife bei jedem Durchgang Zeile für Zeile aus der Datei file in die Variable line einliest. Wenn du in dem command die Variable aber nicht verwendest, macht die Schleife auch nichts damit, das heißt, das Auslesen von file läuft ins Leere.

0
AncheCameo  17.08.2019, 14:18
@AncheCameo

Gerade habe ich mir dein Vorhaben nochmals genauer angesehen: eigentlich kommst du komplett ohne while-read-Schleife aus, da cut auch ganze Dateien bearbeiten kann:

cat /home/mephisto/Downloads/Videos/files/sorted/files_mp4.txt | tr -s ' ' > /home/mephisto/Downloads/Videos/files/sorted/files_mp4_tmp.txt
mv /home/mephisto/Downloads/Videos/files/sorted/files_mp4_tmp.txt /home/mephisto/Downloads/Videos/files/sorted/files_mp4.txt
cut -d " " -f3 /home/mephisto/Downloads/Videos/files/sorted/files_mp4.txt > /home/mephisto/Downloads/Videos/files/sorted/cut/mp4/files_mp4_1.txt
cut -d " " -f4 /home/mephisto/Downloads/Videos/files/sorted/files_mp4.txt > /home/mephisto/Downloads/Videos/files/sorted/cut/mp4/files_mp4_2.txt
cut -d " " -f5 /home/mephisto/Downloads/Videos/files/sorted/files_mp4.txt > /home/mephisto/Downloads/Videos/files/sorted/cut/mp4/files_mp4_3.txt
cut -d " " -f6 /home/mephisto/Downloads/Videos/files/sorted/files_mp4.txt > /home/mephisto/Downloads/Videos/files/sorted/cut/mp4/files_mp4_4.txt
0
Linuxhase  17.08.2019, 08:58

@guenterhalt

Warum verwendest Du eigentlich nicht die Code-TAGs um die Antwort besser zu strukturieren und es den Lesern einfacher machst?

Linuxhase

0
guenterhalt  17.08.2019, 09:41
@Linuxhase

weil die Zeilen zwar Code-Zeilen sind, allein aber niemals die Aufgabe lösen würden.
Ein lauffähiges Script könnte schon 100 Zeilen lang sein. Ist dann aber auch lesbar. Genau aus diesem Grunde habe ich seit Jahren in Scripten auf viele Basisbefehle wie tr und cut und sed ... verzichte. Hier gilt wie überall:
" alles, was man kann ist einfach, auch wenn das, man nicht kann einfacher ist"

Hier ging es also nur um eine Anregung, daher auch mein Schlusssatz

Helfe gern weiter.
0
Linuxhase  17.08.2019, 09:55
@guenterhalt

Findest Du es so nicht auch übersichtlicher und ansprechend?:

so etwas mach ich mit einem Tcl-Script, die zugehörige Shell ( tclsh) sollte in den gängigen Distributionen bereits installiert sein.
Mit
set list [ split <name> ]
erhält man eine Liste der einzelnen Teile, so wie du das willst.
mit
set was [lindex $list 0 ]
set wann [lindex $list 1 ]
set wo [lindex $list 2 ]
steht in
was = "Urlaubs_Bild245
wann = 2018
wo = Frankreich.jpg
was wann wo sind interne Variablen, die man nutzen kann, um die Bilder auf verschiedene Verzeichnisse zu "verteilen"
Helfe gern weiter.
1

Man kann es einfach über Bedingungen in Variablen erreichen.

http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-5.html

https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_f%C3%BCr_Anf%C3%A4nger/

Die Beispiele dienen nur zur Inspiration.

Man kann Problemlos den Dateinamen einlesen und Ihn so entsprechend auch mit Bedingungen setzten.

Beispiel dmesg

Wenn man den Befehl in der Bash ohne alles eingibt kommt eine Riesen Latte an Informationen ,da kann man sich alles Raussuchen was man will. Aber es geht auch anders.

dmesg | greb -i error

Hier kommt nur das zum vorschein wo die Buchstabenreihe "error" vorkommt.

Linux gibt auf 3 Kanälen Informationen aus.

Stin

Stout

und Sterr

https://wiki.archlinux.de/title/Umleitungen

Wenn man weis über welche Kanäle man den Datenfluss haben und Leiten will kann man durch Variablen das gesuchte begrenzen und ausgeben. Der Rest wird ungeachtet verworfen. Es sei denn man Stopft diesen wiederum in eine Textdatei ,falls man diesen noch irgendwie braucht.Und genauso kann man auch Variablen verwenden um den Textfluss zu teilen und auch in DB Unterbringen oder in Excel Tabellen zu übertragen.

Woher ich das weiß:Berufserfahrung

Schau dir den Befehl cut einmal näher an. Damit solltest du zum Ziel kommen.


basti1817 
Fragesteller
 16.08.2019, 22:35

Okay werde mich mal ein bisschen einlesen. Danke dir!

0
basti1817 
Fragesteller
 16.08.2019, 22:38

Okay ich habs. So wirds funktionieren. Danke dir mein Retter :D

0