ubuntuusers.de

In Dateinamen nach 2 Zahlenbereichen suchen & testen ob diese grösser, kleiner oder gleich wert X

Status: Gelöst | Ubuntu-Version: Lubuntu 14.04 (Trusty Tahr)
Antworten |

Jan_Koenig

Anmeldungsdatum:
22. September 2014

Beiträge: 11

Hallo ☺

Ich möchte in Dateinamen nach 2 Zahlenbereichen (bspw. dateiname15-19.txt) suchen und testen ob der Wert zwischen den Zahlen gleich dem wert X sind. ich möchte nach Dateinamen die mehere Zahlenbereiche suchen, und testen ob ein wert größer, kleiner, oder gleich ist dem wert X ist.

Als Beispiel;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Dateiname01-15.txt
Dateiname06-11.txt
Dateiname20-29.txt

wertX=10

find -type f -iname "*dateiname*[0-99]*[0-99].txt"

ausgabe:
Dateiname01-15.txt
Dateiname06-11.txt

Tipps?

Gruß Jan

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

In der bash könnte man das über ein Array machen:

$ touch Dateiname-{01,06,20}-{11,15,29}.txt
$ ls -1
Dateiname-01-11.txt
Dateiname-01-15.txt
Dateiname-01-29.txt
Dateiname-06-11.txt
Dateiname-06-15.txt
Dateiname-06-29.txt
Dateiname-20-11.txt
Dateiname-20-15.txt
Dateiname-20-29.txt
$ x=10
$ for f in Dateiname-*; do v=($(echo "$f" | egrep -o '[[:digit:]]+')); if [ ${v[0]} -lt $x -a ${v[1]} -gt $x ]; then echo "$f"; fi; done
Dateiname-01-11.txt
Dateiname-01-15.txt
Dateiname-01-29.txt
Dateiname-06-11.txt
Dateiname-06-15.txt
Dateiname-06-29.txt
$ x=14
$ for f in Dateiname-*; do v=($(echo "$f" | egrep -o '[[:digit:]]+')); if [ ${v[0]} -lt $x -a ${v[1]} -gt $x ]; then echo "$f"; fi; done
Dateiname-01-15.txt
Dateiname-01-29.txt
Dateiname-06-15.txt
Dateiname-06-29.txt 

Man könnte es auch so machen - das funktioniert auch in der sh:

$ for f in Dateiname-*; do if [ $(echo "$f" | sed -re "s#^.*[^0-9]([0-9]+)[^0-9]+([0-9]+).*\$#\1 -lt $x -a $x -lt \2#") ]; then echo "$f"; fi; done
Dateiname-01-15.txt
Dateiname-01-29.txt
Dateiname-06-15.txt
Dateiname-06-29.txt 

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Der Zahlenbereich 01-15 ist in meinen Augen 14 groß und somit größer als X.

Der Zahlenbereich 09-11 ist in meinen Augen 2 groß und somit kleiner als X.

Deine Beispielausgabe umfasst den Wert 10 und es sind zufällig zwei Zahlenbereiche - das meinst Du aber gar nicht, oder?

Du suchst jeden Zahlenbereich der X umfasst - ungeklärt ist noch, wennn die 10 selbst die Grenze bildet.

Wenn die Dateinamen gar nicht in Unterordner verstreut sind ist "find" keine Hilfe.

1
2
3
for n in Dateiname* ;do von=${n:9:2}; bis=${n:12:2}; (( $X > $von && $X < $bis )) && echo $von $X $bis ; done 
01 10 15
06 10 11

Das > in ein >= zu ändern ist sicher kein Problem. Was noch ein Problem ist, ist das mögliche Vorkommen von 08 oder 09 im Dateinamen. ☺

${n:12:2} schneidet aus der Variablen n, beginnend an Position 12, 2 Zeichen aus.

Jan_Koenig

(Themenstarter)

Anmeldungsdatum:
22. September 2014

Beiträge: 11

Thx ☺ Muss das erstmal testen und verstehen (!), ich komme eigentlich aus der php-welt daher fehlen mir hier noch ein paar basics..

Ich hab leider irgendwie untreffend beschrieben was ich vorhabe.

Es gibt ein Verzeichnis mit Dateien die z.b. “bla 09.00 - 12.00.txt“, “bla 10.00 - 12.00.txt“, “bla 14.00 - 16.00.txt“, etc. heissen.

Mein Ziel ist jetzt einen wert in einer variable festzulegen (mit cron, die aktuelle Stunde, bspw. X=10) und als Ausgabe alle Dateien zu bekommen deren zahlenwert innerhalb der variable liegt. Also “bla 9.00 - 12.00.txt“ (X liegt im Bereich dazwischen), “bla 10.00 - 12.00.txt“ (X passt genau), nicht aber “bla 14.00 - 16.00.txt“.

Das ganze will ich dann an cp übergeben.

Für heute reicht's aber erstmal ☺

Thx und Gruss Jan

D630

Avatar von D630

Anmeldungsdatum:
24. Juli 2013

Beiträge: 329

Wenn der vordere Namensteil wie bei Robert keine Ziffern enthält, ginge ähnlich wie bei user unknown auch so etwas in bash ohne Arrays:

1
2
3
4
5
6
7
8
9
#!/usr/bin/env bash

x=10
for f in *
do
    ff=${f//[^0-9]}
    ((x > ${ff:0:$((${#ff}/2))} && x < ${ff:$((${#ff}/2)):${#ff}})) && \
            printf '%s\n' "$f"
done

Du solltest einmal genau beschreiben, wie die Dateinamen strukturiert sind.

Jan_Koenig

(Themenstarter)

Anmeldungsdatum:
22. September 2014

Beiträge: 11

Guten Morgen,

sorry, hätte das ganze Szenario beschreiben sollen..

Es geht um ein Schüler-Radio Projekt für das es leider keine Kostenstelle gibt, daher versuche ich eine "Sendeautomation" auf einem Cubietruck zum Laufen zu bringen. Also habe ich ein sabashare eingerichtet in welches die Produzierten Audiodateien hinein kommen und entsprechend der Benennung Abgespielt werden.

Realisiert habe ich das über eine Kombination aus MPD, etwas Bash und einen Cron job - Ja, ich weiss, dass geht bestimmt besser. Wie gesagt, ich kann eher php..

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
#!/bin/bash


# Suche Dateien die in der Bennenung Tag-Nr, Tag, Stunde, Minuten im Namen hat
# -> wert wird nach $matchfile übergeben und in die Playlist von MPD gesetzt

PATH=/RPB/lan-shares/Audio:/usr/local/bin:/usr/bin:/bin

# Jahr
jahr=`date +"%Y"`

# Monat für log
monat=`date +"%m"`

# Tag im Monat
tgimonat=`date +"%d"`

# Wochentag als Zahl
wtag=`date +"%w"`

# Tag - nach Muster Mo, Di, Mi, usw.
tag=`date +"%a"`

# Stunden im Format 01, 02, 03, etc.
stunde=`date +"%H"`

# Minuten im Format 01, 02, 03, etc.
minute=`date +"%M"`

# pfad für getauschte Sendungen - dev
#oldfiles=`"/RPB/lan-shares/Audio/Ausgetauschte Sendungen/"`

# Datei die bei Ausfall gespielt werden soll.
streamfailsound="streamfail.mp3"

# zeit die für das kopieren der Ausfalldatei ca nötig ist.
wzeit=1

# MPC Status und ab in mpc-status
mpcstatus=$(mpc status)



# suche nach datei welche aktuellen Tag, und Uhrzeit im namen hat
# gebe Dateinamen ohne Pfad aus
# ergebniss kommt in matchfile
matchfile=`find /RPB/lan-shares/Audio -type f -iname "*00$wtag*$tag*$stunde*$minute*bis*" -exec basename {} \;`


echo *00$wtag*$tag*$stunde*$minute*
#test MUSS GEÄNDERT WERDEN!!
#matchfile=`find /RPB/lan-shares/Audio -type f -iname "*findmich*" -exec basename {} \;`
echo "datei: $matchfile"

# wenn keine passende Daten gefunden werden, prüfe status von mpc
if [ -z "$matchfile" ]; 
	then

		# prüfe ob bereits play ausgegeben wird, wenn nicht lade ausfallsound
		if [[ $mpcstatus != *playing* ]]
			then
			
			# Kopiere ausfallsound in Musikverzeichniss 
			cp /RPB/stream-fail/$streamfailsound /RPB/lan-shares/Audio/$streamfailsound
			mpc clear
			mpc repeat on
			mpc replaygain track
			
			#warte bis das kopieren abgeschlossen ist, und mach den rest
			mpc update
			sleep $wzeit
			mpc add $streamfailsound
			mpc add $streamfailsound
			mpc crossfade 4
			mpc play
			
			
			# nörgeln..
			cp /RPB/script/blank.log /RPB/lan-shares/log/"$jahr $monat $tgimonat - $stunde.$minute Uhr - WARNING Backup Audio.log"
			
			
		fi

	else

		# Aufräumen, falls streamfail aktiv war
		clean=`find /RPB/lan-shares/Audio -type f -iname $streamfailsound`
		rm $clean
			
	echo $wtag $tag $stunde $minute
	echo "gefunden:  $matchfile"
	mpc clear
	mpc update
	sleep $wzeit
	mpc insert "$matchfile"
	mpc repeat off
	mpc crossfade 0
	mpc play
	cp /RPB/script/blank.log /RPB/lan-shares/log/"$jahr $monat $tgimonat - $stunde.$minute Uhr - Playing file - $matchfile".log
fi
exit

Die Audiodateien werden nach dem Muster;

01 Mo 08.00 bis 10.00Uhr -Sendungsname.mp3
01 Mo 10.00 bis 11.00Uhr -Sendungsname.mp3
01 Mo 12.00 bis 13.30Uhr -Sendungsname.mp3
[..]
02 Di 08.00 bis 10.00Uhr -Sendungsname.mp3
02 Di 10.00 bis 11.00Uhr -Sendungsname.mp3

usw.. benannt.

Durch die Wildcards in "*$tag*$stunde*$minute*bis*" sollen alle Dateibezeichnungen verwendet werden können, die "Tag", "Uhrzeit" und als Trennzeichen "bis" enthalten (also auch sowohl "01mo10.00bis11.00Uhr[...].mp3" als auch "01 Mo 08.00 bis 10.00 Uhr [...].mp3). Das ist wichtig, damit die Schüler das ganze zum Schluss auch wirklich hinkriegen..

Das funktioniert soweit, nun gab es aber die Frage ob evtl. auch Programmhinweise über 2 Monitore im Essenssaal ausgegeben werden könnten. Ich dachte das könnte man ähnlich realisieren, der Gedanke;

Schüler erstellen ein Programmbild und kopieren dieses in ein extra lan-share. Sollte die Datei bspw. "01 mo 08.00 - 10.00 -IrgendEinText.png" heißen, müsste Sie am Montag von 8:00 bis 10:00Uhr dargestellt werden, Analog dazu müsste die Datei "01 mo 09.00 bis 12.00 - IrgendEinText.png" am Montag von 09:00 bis 11:00Uhr wiedergegeben werden (Überschneidungen der Zeiträume sind möglich). usw..

Das abspielen wird ebenfalls mit Cron und über die Hintergrundbildfunktion von LXDE umgesetzt.

1
pcmanfm -w "$(find /RPB/lan-shares/programm -type f | shuf -n1)"

ganz blöd;

wtag=`date +"%w"`
tag=`date +"%a"`
stunde=`date +"%H"`

pruefmich= (hier weiss ich nicht weiter..)

suche alle Dateien im Verzeichnis XY die im Namen das Muster *$wtag$*$tag$stunde*bis*$PRUEFMICH*.png haben
und vergleiche ob das aktuellen Datum und Zeit passen oder im angegebenen Zeitraum liegen -> wenn ja, kopiere in Arbeitsverzeichnis

Die Endgültigen Dateibenennungen können noch festgelegt werden, toll wäre aber wenn das möglichst nicht zu sensibel "Fehlbenennungen" wäre, also im schlimmsten fall auch "00001-mOnTaG-blödinn-10.00BIS1100.png" erkannt würde.

Leider weiß ich noch nicht so genau was der geschickteste weg wäre, das zu realisieren, daher auch die etwas schwer verständliche Beschreibung des Vorhabens.

Einen guten Start in die neue Woche ☺ Jan

[edit] Fett gesetzte Dateinamen.. Kann ich hier keine Zeilenumbrüche ohne [code] einfügen?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

Jan Koenig schrieb:

sorry, hätte das ganze Szenario beschreiben sollen..

😀 Das hilft meistens.

Die Audiodateien werden nach dem Muster;

01 Mo 08.00 bis 10.00Uhr -Sendungsname.mp3
01 Mo 10.00 bis 11.00Uhr -Sendungsname.mp3
01 Mo 12.00 bis 13.30Uhr -Sendungsname.mp3
[..]
02 Di 08.00 bis 10.00Uhr -Sendungsname.mp3
02 Di 10.00 bis 11.00Uhr -Sendungsname.mp3

usw.. benannt.

Wie machst Du denn das Datum hier fest? Ist das die erste Zahl? Vielleicht wird es einfacher, wenn Du komplette Zeitstempel nimmst, wie sie z.B. date +%s ausspuckt. Dann gibt es auf jeden Fall auch keinen Stress mit Sommerzeit usw.

Das abspielen wird ebenfalls mit Cron und über die Hintergrundbildfunktion von LXDE umgesetzt.

1
pcmanfm -w "$(find /RPB/lan-shares/programm -type f | shuf -n1)"

Da Du - soweit ich das sehe - Leerzeichen in Dateinamen hast, wird das nicht richtig funktionieren. Viel besser ist

1
find /RPB/lan-shares/programm -type f -print0 | shuf -zn1 | xargs -r0 pcmanfm -w

Wenn man die Dateinamen null-terminiert, dann gibt es keine Probleme mit Sonderzeichen usw.

Man könnte es so realisieren: Dateinamen des Formats "01234567-2345678-Sendungname.mp3".

1
2
3
4
5
6
7
8
9
export time_stamp=$(date +%s) # jetzt
find -type f -exec sh -c '
for f; do
  first="${f%%-*}"
  last="${f#*-}"
  last="${last%%-*}"
  test $first -le $time_stamp -a $time_stamp -lt $last && printf '%s\000' "$f"
done
' -- {} + | ... # weitere Verarbeitung null-terminiert

Wenn Du die Dateinamen z.B. in HTML ausgeben willst, kannst Du die drei Punkte so ersetzen:

1
xargs -r0 printf '<tr>%s</tr>\n'

Aber das ist nur eine grobe Anregung.

Einen guten Start in die neue Woche ☺

Merci. Dir auch.

[edit] Fett gesetzte Dateinamen.. Kann ich hier keine Zeilenumbrüche ohne [code] einfügen?

Doch, siehe mal die Syntaxhinweise oben rechts beim Editieren.

Jan_Koenig

(Themenstarter)

Anmeldungsdatum:
22. September 2014

Beiträge: 11

Thx für Deine Tipps!

jetzt hab ich erst mal damit zu tun das alles zu Verstehen und zu testen. Melde mich garantiert nochmals zu diesem Thema ☺

Jan_Koenig

(Themenstarter)

Anmeldungsdatum:
22. September 2014

Beiträge: 11

Wie machst Du denn das Datum hier fest? Ist das die erste Zahl? Vielleicht wird es einfacher, wenn Du komplette Zeitstempel nimmst, wie sie z.B. date +%s ausspuckt. Dann gibt es auf jeden Fall auch keinen Stress mit Sommerzeit usw.

Da es nur um ein kleine Radioprojekt geht, reicht es wenn das Programm für 7 Tage gestaltet werden kann. das Datum beschränkt sich also auf den Wochentag als Zahl (wtag=date +"%w") den Tag (tag=date +"%a") und die Zeit, daher die angedachte Benennung der Dateien nach dem Muster "01 Mo 10.00 bis 11.00..." Sommerzeit sollte da also eigentlich kein Problem werden oder steh ich auf dem Schlauch?

Hab mir scheinbar mehr vorgenommen als ursprünglich gedacht.

Naja, muss jetzt erst mal zur Arbeit ☹ Ich meld mich sobald ich nicht mehr weiter weiß.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Jan Koenig schrieb: Ich kann ja nicht anders - ich muss auf meine Lieblingswunden hinweisen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash


# Zuviel vertical space - den bekommt man niemals wieder. 

# Jahr
jahr=`date +"%Y"`

# Backticks sind veraltet - nimm jahr=$(date +"%Y")

streamfailsound="streamfail.mp3"

# Überlüssige Anführungsstriche 

# MPC Status und ab in mpc-status
mpcstatus=$(mpc status)

# ach, hier geht's? 

exit
#
# exit macht das Programm alleine, und besser. 
# Das benutzt man nur, wenn man vorzeitig irgendwo aussteigen will, aber dann mit Exitcode.
#

Die Audiodateien werden nach dem Muster;

01 Mo 08.00 bis 10.00Uhr -Sendungsname.mp3
02 Di 10.00 bis 11.00Uhr -Sendungsname.mp3

usw.. benannt.

Durch die Wildcards in "*$tag*$stunde*$minute*bis*" sollen alle Dateibezeichnungen verwendet werden können, die "Tag", "Uhrzeit" und als Trennzeichen "bis" enthalten (also auch sowohl "01mo10.00bis11.00Uhr[...].mp3" als auch "01 Mo 08.00 bis 10.00 Uhr [...].mp3). Das ist wichtig, damit die Schüler das ganze zum Schluss auch wirklich hinkriegen..

Ohne eine gewisse Formatierung wirst Du nicht auskommen. Eine vage Formatierung bedeutet dabei ein kompliziertes Regelwerk, aber ein striktes Regelwerk einzuhalten ist leicht. Ein striktes Regelwerk ist kurz und übersichtlich - ein vages ist lang und verschlungen.

Beispielsweise ist mir noch unklar, ob eine führende Null bei der Uhrzeit sein muss, wenn die Stunden einstellig sind. Sind andere Trenner als Punkt erlaubt? Müssen Nachpunktstellen angegeben werden oder ist folgendes legitim:

01 Mo 08.00 bis 10.00Uhr -Sendungsname.mp3
1 Mo 8.00 bis 10.00Uhr -Sendungsname.mp3
01 Mo 08:00 bis 10:00Uhr -Sendungsname.mp3
01 Mo 08'00 bis 10'00Uhr -Sendungsname.mp3
01 Mo 08 bis 10Uhr -Sendungsname.mp3
3Wed8:30-10-Sendungsname.MP3

Schüler erstellen ein Programmbild und kopieren dieses in ein extra lan-share. Sollte die Datei bspw. "01 mo 08.00 - 10.00 -IrgendEinText.png" heißen, müsste Sie am Montag von 8:00 bis 10:00Uhr dargestellt werden, Analog dazu müsste die Datei "01 mo 09.00 bis 12.00 - IrgendEinText.png" am Montag von 09:00 bis 11:00Uhr wiedergegeben werden (Überschneidungen der Zeiträume sind möglich).

bis 12, oder?

Da Du sowieso ein Format definieren musst, um die Zeit zu extrahieren würde ich das Format so festlegen, dass es möglichst leicht zu extrahieren ist, solange es bei der Eingabe nicht zu schwierig wird dadurch - also Unixzeit in Sekunden seit 1970 würde ich auch nicht nehmen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Ich würde übrigens Tag, von, bis jeweils ohne führende Null nehmen. Als fixen Trenner das Minuszeichen, Uhrzeiten mit Punkttrennern für Minuten, deren Angabe dann zwingend ist, also etwa:

1
3-8.00-10.30-blafasel.mp3 

Nach dem Dritten Minus kann dann alles mögliche kommen, inkl. Leerzeichen, aber kein Zeilenumbruch, Seitenumbruch oder Tab.

Führende Nullen muss man erst wieder prüfen und loswerden, denn diese führen dazu, dass eine Zahl als oktal interpretiert wird, sonst führt es bei 08 und 09 zu einer Fehlermeldung.

Wozu soll Mo, Di, usw. gut sein? Zur Fehlerprüfung?

Jan_Koenig

(Themenstarter)

Anmeldungsdatum:
22. September 2014

Beiträge: 11

user unknown schrieb:

Ich kann ja nicht anders - ich muss auf meine Lieblingswunden hinweisen:

Da hab ich gar nichts dagegen ☺ Aber bei;

# Zuviel vertical space - den bekommt man niemals wieder.

# Jahr jahr=date +"%Y"

Warum? Was Spricht dagegen ein paar Zeilen mehr einzufügen, wenn es der Übersichtlichkeit dient?

exit

Bin ich von php gewohnt, ist mir rein gerutscht 😉

Ohne eine gewisse Formatierung wirst Du nicht auskommen. Eine vage Formatierung bedeutet dabei ein kompliziertes Regelwerk, aber ein striktes Regelwerk einzuhalten ist leicht. Ein striktes Regelwerk ist kurz und übersichtlich - ein vages ist lang und verschlungen.

Das macht Sinn.

Beispielsweise ist mir noch unklar, ob eine führende Null bei der Uhrzeit sein muss, wenn die Stunden einstellig sind. Sind andere Trenner als Punkt erlaubt? Müssen Nachpunktstellen angegeben werden oder ist folgendes legitim:

01 Mo 08.00 bis 10.00Uhr -Sendungsname.mp3
1 Mo 8.00 bis 10.00Uhr -Sendungsname.mp3
01 Mo 08:00 bis 10:00Uhr -Sendungsname.mp3
01 Mo 08'00 bis 10'00Uhr -Sendungsname.mp3
01 Mo 08 bis 10Uhr -Sendungsname.mp3
3Wed8:30-10-Sendungsname.MP3

Im Prinzip wäre von der Benennung her alles in Ordnung was einigermaßen Verständlich ist. Die erste Stelle im Namen sollte der Übersicht im Windows-Explorer dienen, der zweite Teil (mo-so) der besseren Orientierung. Wie sieht es mit Leerzeichen im teil "-Sendungsname" aus? worauf muss ich hierbei achten?

3Wed8:30-10-Sendungsname.MP3

Ich denke wenn Wed durch Mi ersetzt werden könnte, wäre das sicherlich völlig OK.

bis 12, oder?

Richtig, da hab ich nicht aufgepasst.

[..] also Unixzeit in Sekunden seit 1970 würde ich auch nicht nehmen.

wäre aber lustig und die Lehrer begeistert 😉

Mal sehen wie weit ich komme, weitere Fragen sind garantiert 😉 Thx für die Unterstützung.

Antworten |