Bash: Teile vom Dateinamen auslesen und in Array schreiben

Status
Für weitere Antworten geschlossen.

peterhoffmann

Benutzer
Sehr erfahren
Mitglied seit
17. Dez 2014
Beiträge
5.575
Punkte für Reaktionen
1.408
Punkte
234
Hallo,

ich habe einen Ordner mit vielen Fotos, die vom Dateinamen so strukturiert sind: JahrMonatTag_Uhrzeit_Zusatzinfos.jpg

Beispiel: 20171031_1741_Baustelle.jpg

Nun habe ich mir ein kleines Script geschrieben, welches jeweils alle Bilder eines Jahres (z.B. 2017) in ein Archiv packt (fotos2017.7z), mit Passwort versieht und woanders ablegt.

Rich (BBCode):
meinarray=( 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 )
for i in ${meinarray[@]}; do
7z a -t7z -m0=LZMA -mmt=on -mx=5 -md=96m -mfb=256 -mhe=on -pPASSWORT /volume1/backup/ZIELVERZEICHNIS/fotos$i.7z /volume1/photo/QUELLVERZEICHNIS
done

Ich möchte aber davon weg die Jahreszahlen einzeln in den Array zu schreiben.

Wie kann ich es gestalten, dass die Dateinamen im Verzeichnis ausgelesen werden und das Script sich die Jahreszahlen selbst erarbeitet und in den Array schreibt?

Viele Grüße
Peter
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
for i in $(seq -w 2000 2100)

Sonst nimmst du einfach ein $(find /pfad -type d)
 

peterhoffmann

Benutzer
Sehr erfahren
Mitglied seit
17. Dez 2014
Beiträge
5.575
Punkte für Reaktionen
1.408
Punkte
234
seq: Das produziert mir nur eine Zahlenreihe und somit viele falsche Einträge, da Fotos aus manchen Jahren gar nicht vorhanden sind.
find: Hier wird mir nur der Inhalt vom Verzeichnis aufgelistet. Ich brauche aber nur die Jahreszahlen.

Zum Verständnis:
Im Verzeichnis sind Fotos aus den Jahren 1938 bis 2017. Der Aufbau vom Dateinamen ist immer gleich: JahrMonatTag_Uhrzeit_Name.jpg (Beispiel: 20171031_1741_Baustelle.jpg).
Das Script soll nun aus allen Dateinamen die Jahrenzahlen (die ersten vier Ziffern) nehmen, die Doppelten löschen (pro Jahr gibt es oft mehr als nur 1 Foto) und diese Liste in einen Array ablegen.
 

TeXniXo

Benutzer
Mitglied seit
07. Mai 2012
Beiträge
4.948
Punkte für Reaktionen
99
Punkte
134
Wozu eig. diese Umstände, wenn du z.B. bis 2050 in 3 Minuten alles niedergeschrieben hast und du diese Datei eig. gar nicht mehr bearbeiten brauchst und du auch einige Zeilen = Performance weniger hast.
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
29.968
Punkte für Reaktionen
1.238
Punkte
754
Probiere einmal

Rich (BBCode):
find <pfad> -maxdepth 1 -type d

<pfad> musst Du durch richtigen Pfad ersetzen. Ich habe es gerade mit dem Pfad . getestet, und das liefert genau die Verzeichnisnamen unter <pfad>, aber nicht deren Unterverzeichnisse.
 

peterhoffmann

Benutzer
Sehr erfahren
Mitglied seit
17. Dez 2014
Beiträge
5.575
Punkte für Reaktionen
1.408
Punkte
234
wenn du z.B. bis 2050 in 3 Minuten alles niedergeschrieben hast
Das folgende würde das machen:
Rich (BBCode):
seq -w 1938 2050
Aber jeder Wert wird in der Schleife verarbeitet und damit auch bei nicht vorhandenen Fotos ein (leeres) Archiv erzeugt. :(


Probiere einmal
Rich (BBCode):
find <pfad> -maxdepth 1 -type d
Ich brauche nicht die Verzeichnisnamen, sondern von allen Dateinamen im Verzeichnis die ersten vier Zeichen.
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
29.968
Punkte für Reaktionen
1.238
Punkte
754
Ok, dann hier dazu ein Vorschlag:

Rich (BBCode):
#!/bin/sh

for i in `ls /volume1/net/tmp`
do
  echo ${i:0:4}
done

Ist nicht die Lösung, hilft aber vielleicht auf dem Weg dahin. Den Pfad musst Du natürlich austauschen.
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Dann holst du einfach alles per find in die Schleife. Und schneidest alles außer die Jahre ab, und dann ein uniq oder halt direkt mv/cp.
 

peterhoffmann

Benutzer
Sehr erfahren
Mitglied seit
17. Dez 2014
Beiträge
5.575
Punkte für Reaktionen
1.408
Punkte
234
Ich bekomme es nicht hin, die einzelnen Befehle richtig miteinander zu kombinieren. :(

Meine Erkenntnisse bisher:

Dateien aus dem Verzeichnis auslesen:
Rich (BBCode):
find -maxdepth 1 -type f -exec basename {} \;

Auf die ersten 4 Zeichen kürzen:
Rich (BBCode):
sed -r 's/(.{4}).*/\1/;q'

Doppelte aussortieren:
Rich (BBCode):
sort -u (oder uniq)
 

peterhoffmann

Benutzer
Sehr erfahren
Mitglied seit
17. Dez 2014
Beiträge
5.575
Punkte für Reaktionen
1.408
Punkte
234
Mir ist ein Weg eingefallen, der viel einfacher ist.

Ich lasse das Script einfach die Jahreszahlen abarbeiten und prüfe per if und ls, ob Dateien aus dem jeweiligen Jahr vorhanden sind.

Rich (BBCode):
meinarray=( 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050  )

for i in ${meinarray[@]}; do

if ls /PFADzudenDateien/$i* 1> /dev/null 2>&1; then
7z a -t7z -m0=LZMA -mmt=on -mx=5 -md=96m -mfb=256 -mhe=on -pPasswort /PFADzumBackup/fotos$i.7z /PFADzudenDateien/$i*.*
fi
done

Ich hätte gerne für die Jahreszahlen "seq 1900 2050" genommen, aber irgendwie habe ich es nicht vernünftig geschafft dies in einen Array zu schreiben. Egal, stehen halt die Jahreszahlen drin. Bis 2050 läuft es ja und dann brauche ich sowieso nur noch das "letzte Hemd". ;)
 
Zuletzt bearbeitet:

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
12.463
Punkte für Reaktionen
2.937
Punkte
423
Ist nicht
Code:
...
if [ -d /PFADzudenDateien/$i ]; then
...
sinnvoller und lesbarer?
(achte auf die die Blanks nach/vor [] )
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Gibt zig verschiedene Möglichkeiten. Allerdings würde ich nicht alle Jahreszahlen aufschreiben.

for i in $(seq -w 1900 2050); do
if test dir ..
done


for i in $(find /PFAD -maxdepth 1 -type d -regex '.*[1-2][0-9][0-9][0-9].*')
echo $i
done

usw..
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat 

 
 
  AdBlocker gefunden!

Du bist nicht hier, um Support für Adblocker zu erhalten. Dein Adblocker funktioniert bereits ;-)

Klar machen Adblocker einen guten Job, aber sie blockieren auch nützliche Funktionen.

Das Forum wird mit hohem technischen, zeitlichen und finanziellen Aufwand kostenfrei zur Verfügung gestellt. Wir zeigen keine offensive Werbung und bemühen uns um eine dezente Integration.

Bitte unterstütze dieses Forum, in dem du deinen Adblocker für diese Seite deaktivierst.

Du kannst uns auch über unseren Kaffeautomat einen Kaffe ausgeben oder ein PUR Abo abschließen und das Forum so werbefrei nutzen.

Vielen Dank für Deine Unterstützung!