PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash: Fehlende Dateien in Sequenz finden



skybluenova
15-06-2007, 14:56
Hallo an alle,

ich moechte per Script in einem Verzeichnis nach durchnummerierten Dateien suchen, die "fehlen" ... zum besseren Verstaendnis:

Angenommen, die Dateien sind nummeriert von datei001..datei050. Nun fehlt aber die Datei datei031! Ich wuerde folgendermassen vorgehen:

Die erste Zeile des Verzeichnisinhalts lesen
Die Nummer pro Datei extrahieren (001...) und in einer Variablen speichern
zu dieser Variable var zaehle ich 1 dazu = var+1 und speichere sie als varNext
Ich lese die naechste Zeile (Datei) aus dem Verzeichnis
Extrahiere die naechste Nummer und speichere sie in der Variablen var
DIESE Variable var muss nun den Wert haben wie varNext - ansonsten fehlt die vorhergehende Datei.

Ich hoffe die Beschreibung ist verstaendlich ... Zweck soll sein, fehlende Timecodes in Movieframes (einzeln als File gespeichert) zu finden.

Ich bedanke mich im Voraus fuer eure Antworten und Hilfe!

Herzliche Gruesse

Manuel

jan61
16-06-2007, 22:29
...
ich moechte per Script in einem Verzeichnis nach durchnummerierten Dateien suchen, die "fehlen" ...

Ich würde es ungefähr so machen:

z=1
cd /Pfad/zum/Verzeichnis
ls datei[0-9][0-9][0-9] | while read f; do
n=`echo $f | sed 's/.*\([0-9]\{3,3\}\)$/\1/'`
test $n -eq $z || echo "$z fehlt"
z=`expr $n + 1`
doneJan

rais
17-06-2007, 09:00
Moin moin,
das würde ich etwa so angehen:


#!/bin/bash
declare -i A
declare -i E
declare -i S
let A=1; let E=50
D=/Pfad/zum/Verzeichnis
PRE=datei
SFX=""

let S=$A
let E=$E+1
while [ $E -gt $S ]; do
X=$S
test $S -lt 10 && X="0$X"
test $S -lt 100 && X="0$X"
F="$D/$PRE$X$SFX"
if [ ! -r "$F" ]; then
echo "$F fehlt!"
fi
let S=$S+1
done

Das sieht zwar etwas umständlicher aus als bei Jan, dafür werden auch aufeinander folgende Fehldateien erkannt, z.B. wenn "datei031" und "datei032" fehlen -- und eine fehlende "datei050" (sprich: was ist, wenn's am Ende fehlt?) wäre auch kein Problem;-)
MfG,

jan61
17-06-2007, 11:47
...Das sieht zwar etwas umständlicher aus als bei Jan, dafür werden auch aufeinander folgende Fehldateien erkannt, z.B. wenn "datei031" und "datei032" fehlen -- und eine fehlende "datei050" (sprich: was ist, wenn's am Ende fehlt?) wäre auch kein Problem;-)
MfG,

Stimmt, das Problem fehlender aufeinanderfolgender Dateien fiel mir später auch noch auf. Fehlendes Ende kannst Du nur dann erkennen, wenn Du (wie bei Deinem Code) auch weisst, was die maximale Nummer ist.

In diesem Fall würde ich aber eine kürzere Variante wählen:

cd /Pfad/zum/Verzeichnis
max=50
for z in `seq 1 $max`; do
f=datei`printf "%3.3d" $z`
test -f $f || echo $f fehlt
doneSo ähnlich kann man dann übrigens auch bei unbekanntem Ende verfahren (gleich wie bei Dir mit variablem Prefix):

cd /Pfad/zum/Verzeichnis
prefix=datei
max=`ls -r ${prefix}[0-9][0-9][0-9] | head -n 1 | sed 's/^'$prefix'//'`
echo "max. Nummer = $max"
for z in `seq 1 $max`; do
f=$prefix`printf "%3.3d" $z`
test -f $f || echo $f fehlt
doneJan

jan61
17-06-2007, 12:03
Moin,

mir sind 2 Kleinigkeiten in Deinem Code aufgefallen:



...
# diese Zeile kann man sparen, wenn man [ $E -ge $S ] benutzt
let E=$E+1
while [ $E -gt $S ]; do
...
# damit pruefst du nicht, ob $F existiert, sondern ob Du $F lesen
# kannst. Es kann dann auch z. B. ein Verzeichnis sein
# ein ".. fehlt" kriegst Du auch, wenn $F zwar existiert aber nicht von
# Dir lesbar ist
if [ ! -r "$F" ]; then
echo "$F fehlt!"
fi
......

Jan

skybluenova
18-06-2007, 10:43
Hallo,

erstmal vielen Dank fuer die vielen Antworten!
Ich habe folgenden Code getestet:



#!/bin/bash
prefix=datei
max=`ls -r ${prefix}[0-9][0-9][0-9] | head -n 1 | sed 's/^'$prefix'//'`
echo "max. Nummer = $max"
for z in `seq 1 $max`; do
f=$prefix`printf "%3.3d" $z`
test -f $f || echo $f fehlt
done


Leider taucht bei mir gleich ein Syntaxfehler auf:

$ ./test.sh
ls: datei[0-9][0-9][0-9]: No such file or directory
max. Nummer =
./test.sh: line 1: seq: command not found

Ich bin leider nicht sehr fit in bash-scripting, seht ihr de fehler???

jan61
18-06-2007, 21:56
...Leider taucht bei mir gleich ein Syntaxfehler auf:

$ ./test.sh
ls: datei[0-9][0-9][0-9]: No such file or directory
max. Nummer =
./test.sh: line 1: seq: command not found
...

Es gibt in dem Verzeichnis, aus dem Du das Script aufgerufen hast, keine derartigen Dateien. Stell ein cd /Pfad/zum/Verzeichnis an den Anfang des Scripts (Zeile 2, nicht vor #! /bin/bash), wie in meinem Beispiel zu sehen (natürlich durch den korrekten Pfad bei Dir zu ersetzen). Der 2. Fehler bedeutet schlicht und einfach das, was da steht: Offensichtlich gibt es auf Deinem System keinen Befehl seq. Schon komisch, normalerweise sollte der auf einem Linux-System da sein.

Du kannst Dir behelfen, indem Du stattdessen eine while-Schleife benutzt:
#!/bin/bash
cd /Pfad/zum/Verzeichnis
prefix=datei
max=`ls -r ${prefix}[0-9][0-9][0-9] | head -n 1 | sed 's/^'$prefix'//'`
echo "max. Nummer = $max"
z=1
while test $z -le $max; do
f=$prefix`printf "%3.3d" $z`
test -f $f || echo $f fehlt
z=`expr $z + 1`
doneJan

P.S.: Du beschäftigst Dich aber demnächst mal mit der Shell - versprochen?

skybluenova
19-06-2007, 11:12
Isr Mac OS 10.4.9, leider scheinen nicht allzu viele Unix-Befehle vorhanden zu sein... danke fuer die Hinweise!! Gerine Bash-Kenntnisse habe ich ja, aber es gibt einige Sachen, gerade Platzhaltergeschichten, da kann man verzweifeln ;-)

EDIT: Ich versuche ein bisschen mit grep zu basteln, aber es klappt nicht richtig, dass auch Dateien mit SUFFIX richtig gesucht und angezeigt werden. Sobald die zu suchende Datei eine Endung hat, bekomme ich z.B. die folgende Meldung:

./tcBreakDetect.sh: line 22: [: 01319951.dpx: integer expression expected

jan61
19-06-2007, 19:33
Isr Mac OS 10.4.9, leider scheinen nicht allzu viele Unix-Befehle vorhanden zu sein... danke fuer die Hinweise!! ...

DAS hättest Du uns allerdings auch gleich verraten können. Wenn hier Fragen reinkommen, dann denkt man zuallererst mal an Linux /BSD oder Solaris / AIX - zumindest ich muss mit der Nase drauf gestupst werden, wenn das nicht der Fall ist.



EDIT: Ich versuche ein bisschen mit grep zu basteln, aber es klappt nicht richtig, dass auch Dateien mit SUFFIX richtig gesucht und angezeigt werden. Sobald die zu suchende Datei eine Endung hat, bekomme ich z.B. die folgende Meldung:

./tcBreakDetect.sh: line 22: [: 01319951.dpx: integer expression expected

Wenn Du jetzt noch verrätst, was Du suchst und wie Dein grep aussieht ...

Wenn Du das Script aus dem vorigen Posting meinst:


#!/bin/bash
cd /Pfad/zum/Verzeichnis
prefix=datei
suffix=.ext
max=`ls -r ${prefix}[0-9][0-9][0-9]$suffix | head -n 1 | sed 's/^'$prefix'\(.*\)'$suffix'$/\1/'`
echo "max. Nummer = $max"
z=1
while test $z -le $max; do
f=$prefix`printf "%3.3d" $z`$suffix
test -f $f || echo $f fehlt
z=`expr $z + 1`
doneJan

skybluenova
19-06-2007, 19:44
Hi Jan,
hi alle,

jetzt hat die bloede Fragerei meinerseits aber auch ein Ende :-) Habe vieles selbst rausgefunden, trial and error ...

vielen Dank fuer die Hilfe!!