ubuntuusers.de

Zahl aus Dateinamen in Variable speichern

Status: Gelöst | Ubuntu-Version: Server 13.10 (Saucy Salamander)
Antworten |

Linde23

Anmeldungsdatum:
16. Mai 2014

Beiträge: Zähle...

Hallo erstmal.

Ich möchte eine Zahl aus der neuesten Datei des Verzeichnisses rausfiltern und diese in einer Variable speichern.

Bsp.: Dateiname-5.txt –> ich brauche die 5 in einer Variable.

Der Dateiname vor der Zahl kann unterschiedlich lang sein aber er endet immer mit "-x.dateityp" wobei das x für eine Ziffer steht und dateityp für unterschiedliche Dateitypen stehen kann (txt, tgz, ...).

dir="/Pfad_Zu_Dem_Verzeichnis"
Datei="${dir}/$(ls -tr | tail -1)"
echo $Datei | egrep -o "[0-9]+"

gibt mir schon das gewünschte aus allerdings stehe ich gerade auf dem Schlauch wie ich das in eine Variable bekomme. -.-

Kann mir da mal bitte jemand helfen? Bzw. gibt es eine andere / schönere Lösung dafür?

Danke schonmal

Mit freundlichem Gruß

Linde23

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

Herzlich willkommen hier im Forum!

Linde23 schrieb:

Ich möchte eine Zahl aus der neuesten Datei des Verzeichnisses rausfiltern und diese in einer Variable speichern.

Kann mir da mal bitte jemand helfen? Bzw. gibt es eine andere / schönere Lösung dafür?

ls in solchen Fällen zu benutzen ist nicht so gut, da es seine eigene Formatierung mitbringt. Du willst aber eigentlich an die Metadaten direkt ran. Hier ist eine Option:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
dir="/Pfad_Zu_Dem_Verzeichnis"

# init timestamp
newest_time=0

for f in "$dir"/*; do
  # ts is seconds since the epoch of modification time
  ts=$(stat -c '%Y' "$f")

  if [ $ts -ge $newest_time ]; then
    newest_time=$ts
    newest_file="$f"
  fi
done

# newest_file now contains the path of the newest file
number=$(echo "$newest_file" | egrep -o '[[:digit:]]+')

Die for-Schleife ermittelt die neueste Datei im Verzeichnis und die letzte Zeile extrahiert die Zahl.

Ciao

robert

Edit: ein paar Variablen umbenannt und Erläuterung eingefügt.

Linde23

(Themenstarter)

Anmeldungsdatum:
16. Mai 2014

Beiträge: 2

rklm schrieb:

ls in solchen Fällen zu benutzen ist nicht so gut, da es seine eigene Formatierung mitbringt. Du willst aber eigentlich an die Metadaten direkt ran. Hier ist eine Option:

auch wieder wahr ^^ Dankeschön für den Tipp

rklm schrieb:

...
for f in "$dir"/*; do
  # ts is seconds since the epoch of modification time
  ts=$(stat -c '%Y' "$f")

  if [ $ts -ge $newest_time ]; then
    newest_time=$ts
    newest_file="$f"
  fi
done
...

Ich habe zwar gehofft, dass ohne Schleifen lösen zu können aber so funktioniert es wenigstens ☺

Ich bedanke mich recht herzlich für die schnelle Hilfe

Mit freundlichem Gruß

Linde23

xubuntufriese

Avatar von xubuntufriese

Anmeldungsdatum:
3. Mai 2014

Beiträge: 340

rklm schrieb:

ls in solchen Fällen zu benutzen ist nicht so gut, da es seine eigene Formatierung mitbringt.

Das Argument verstehe ich nicht. Meinst Du falls sich das Ausgabeformat von ls einmal ändern sollte?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
dir="/Pfad_Zu_Dem_Verzeichnis"

# init timestamp
newest_time=0

for f in "$dir"/*; do
  # ts is seconds since the epoch of modification time
  ts=$(stat -c '%Y' "$f")

  if [ $ts -ge $newest_time ]; then
    newest_time=$ts
    newest_file="$f"
  fi
done

# newest_file now contains the path of the newest file
number=$(echo "$newest_file" | egrep -o '[[:digit:]]+')

Die for-Schleife ermittelt die neueste Datei im Verzeichnis und die letzte Zeile extrahiert die Zahl.

Kann $newest_file" nun nicht auch ein Verzeichnis sein?

Ist

ZAHL=$(ls -ltr | egrep '^-' | tail -1 | egrep -o ' [0-9]+[^0-9]*$' | egrep -o '[0-9]+')

nicht doch einfacher?

"ls -ltr" wegen Listendarstellung

"egrep '^-'" damit nur Dateien aber keine Verzeichnisse oder Links erkannt werden

"tail -1" nur die neueste Datei (zB foo3bar5x.txt)

"egrep -o ' [0-9]+[^0-9]*$'" nur der Part mit Zahlen, der am weitesten rechts steht (5x.txt)

"egrep -o '[0-9]+'" und davon nur die Zahl (5)

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

xubuntufriese schrieb:

rklm schrieb:

ls in solchen Fällen zu benutzen ist nicht so gut, da es seine eigene Formatierung mitbringt.

Das Argument verstehe ich nicht. Meinst Du falls sich das Ausgabeformat von ls einmal ändern sollte?

Genau. Oder auch, weil das Ausgabeformat durch die Umgebung geändert werden kann. ls ist dazu da, Dateilisten für den Menschen lesbar auszugeben, aber nicht dafür, sie maschinell weiter zu verarbeiten.

Kann $newest_file" nun nicht auch ein Verzeichnis sein?

Das kann alles mögliche sein. Es kann auch sein, dass das gegebene Verzeichnis leer ist. Beides kann man durch kleine Änderungen erkennen / verhindern:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
dir="/Pfad_Zu_Dem_Verzeichnis"

# init timestamp
newest_time=0
unset newest_file

for f in "$dir"/*; do
  if [ -f "$f" ]; then
    # ts is seconds since the epoch of modification time
    ts=$(stat -c '%Y' "$f")

    if [ $ts -ge $newest_time ]; then
      newest_time=$ts
      newest_file="$f"
    fi
  fi
done

# newest_file now contains the path of the newest file or nothing
if [ -n "$newest_file" ]; then
  number=$(echo "$newest_file" | egrep -o '[[:digit:]]+')
else
  echo "ERROR: no file found in $dir" >&2
fi

Ich habe angenommen, dass in dem Verzeichnis nur gewünschte Dateien vorhanden sind, weil auch dir ursprüngliche Lösung nicht gefiltert hat. Außerdem wollte es nicht gleich zu kompliziert machen. Man kann sich natürlich noch mehr Tests vorstellen z.B. um zu erkennen, dass tatsächlich Ziffern im Dateinamen vorhanden sind.

Ist

ZAHL=$(ls -ltr | egrep '^-' | tail -1 | egrep -o ' [0-9]+[^0-9]*$' | egrep -o '[0-9]+')

nicht doch einfacher?

Es ist ein wenig effizienter, ls -lt und head -1 zu nehmen. "Einfach" und "robust" widersprechen sich halt oft. Und Geschmäcker sind natürlich verschieden... ☺

Antworten |