• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] Dateien in Verzeichnis zählen

sphings

Member
Hallo,

ich hab ein kleines Problem.
Ich habe eine unbestimmte Anzahl von bildern in einem Verzeichnis.
die Bilder haben immer folgende Bezeichnung:

JJJJ-MM-TT-###~0001.jpg
JJJJ-MM-TT-###~0002.jpg
JJJJ-MM-TT-###~0003.jpg
JJJJ-MM-TT-###~0004.jpg
...

oder
JJJJ-MM-TT-###a.jpg
JJJJ-MM-TT-###aR.jpg
JJJJ-MM-TT-###b.jpg
JJJJ-MM-TT-###bR.jpg
....

wobei JJJJ für Jahr, MM für Monat und TT für Tag steht.
#=eine beliebige Zahl.

jetzt muss ich irgendwie per script herausfinden wieviele dateien mit dem namen JJJJ-MM-TT-001 JJJJ-MM-TT-002 JJJJ-MM-TT-003 usw vorhanden sind und muss die anzahl in eine datei schreiben und das für alle datein der reihenfolge nach untereinander.

hat da jemand ne idee?

gruß

sphings
 
OP
S

sphings

Member
proofy schrieb:
Könnte schon reichen:
Code:
ls -1 *` date +"%Y-%m-%d"`.jpg|wc -l

neine leider nicht aus 2 Gründen.
1. weil die dateien von verschiedenen daten seien können.
2. weil er dann alle auflistet mit JJJ-MM-TT*.jpg und nicht nur JJJJ-MM-TT-###*.jpg
 

Gimpel

Guru
Ist zwar verdammt häßlich, aber ne Idee..

Da ja die ### Zahl immer drei Ziffern hat, also 001, 002, 012, 453 etc, brauchts wohl drei Parts, damit ls oder find es richtig ausspuckt

für 000-009:
Code:
count=0;while [ $count -le 9 ];do echo 00$count;count=$[$count+1];done
für 010-099:
Code:
count=10;while [ $count -le 99 ];do echo 0$count;count=$[$count+1];done
und für 100-999:
Code:
count=100;while [ $count -le 999 ];do echo $count;count=$[$count+1];done

Kein Plan ob und wie man das in eine Schleife packt.
Das 'echo $count' halt ersetzen durch irgendwas wie 'ls -1 *-$count*.jpg|wc -l'

Mannomann is das häßlich, hat jemand ne bessere Idee? :)
 

regexer

Advanced Hacker
Ich weiß jetzt nicht, ob ich die Aufgabenstellung richtig verstanden habe... Willst du wissen wieviele Dateien es jeweils von einer Datum-Zahl-Kobination gibt?

Wie auch immer, ich würde es auf jeden Fall Perl benutzen.
Code:
ls ????-??-??-???*.jpg | cut -c1-14 | perl -e '$cnt{$_}++ while(<>); print "$cnt{$_}\t$_" for(sort keys(%cnt))'

Falls du nur die Ziffern oder nur das Datum auswerten willst, musst du nur den cut entsprechend anpassen ...

Falls du etwas ganz anderes willst, schreibe einfach ein Beispiel, was als Ausgabe ungefähr rauskommen soll.
 

regexer

Advanced Hacker
Gimpel schrieb:
Mannomann is das häßlich, hat jemand ne bessere Idee? :)
Zumindest die ganzen counts könnte man durch ein simples
Code:
seq -w 0 999
ersetzen.

Aber ich würde wie gesagt die oben genannte perl-Lösung vorziehen. Falls nur die dreistellige nummer gezählt werden soll, den cut abändern auf -c12-14. Also:

Code:
ls ????-??-??-???*.jpg | cut -c12-14 | perl -e '$cnt{$_}++ while(<>); print "$cnt{$_}\t$_" for(sort keys(%cnt))'

Alles klar?
 
OP
S

sphings

Member
notoxp schrieb:
Gimpel schrieb:
Mannomann is das häßlich, hat jemand ne bessere Idee? :)
Zumindest die ganzen counts könnte man durch ein simples
Code:
seq -w 0 999
ersetzen.

Aber ich würde wie gesagt die oben genannte perl-Lösung vorziehen. Falls nur die dreistellige nummer gezählt werden soll, den cut abändern auf -c12-14. Also:

Code:
ls ????-??-??-???*.jpg | cut -c12-14 | perl -e '$cnt{$_}++ while(<>); print "$cnt{$_}\t$_" for(sort keys(%cnt))'

Alles klar?

Code:
ls ????-??-??-???*.jpg | cut -c12-14 | perl -e '$cnt{$_}++ while(<>); print "$cnt{$_}\t$_" for(sort keys(%cnt))' 1> anzahl

ist fast genau das was ich gesucht habe.
allerdings wäre es super wenn nur die anzahl nicht die nummer drin stehen würde. geht das auch?

derzeitige ausgabe:

Code:
8       001
6       002
2       003
2       004
2       005
5       006
...

Das sollte nur drin stehen:
Code:
8
6 
2       
2       
2       
5  
...
 

regexer

Advanced Hacker
sphings schrieb:
Code:
ls ????-??-??-???*.jpg | cut -c12-14 | perl -e '$cnt{$_}++ while(<>); print "$cnt{$_}\t$_" for(sort keys(%cnt))' 1> anzahl
ist fast genau das was ich gesucht habe.
allerdings wäre es super wenn nur die anzahl nicht die nummer drin stehen würde. geht das auch?
Natürlich geht das. Allerdings muss ich dazusagen, dass nur das gezählt wird, was da ist. Wenn also keine Datei mit der Nummer 005 vorhanden ist, steht auf Zeile fünf keine Null sondern die Anzahl der nächsten vorhandenen Nummer (wahscheinlich 006).

Aber wenn du es unbedingt so und nicht anders brauchst, dann ändere den print wiefolgt ab:
Code:
 ... print "$cnt{$_}\n" ...

EDIT: Oder aber (wenn du unbedingt Nullen haben willst):

Code:
perl -e '$cnt[$_]++ while(<>); printf "%d\n", $cnt[$_] for(1..999)'
Dann musst du aber sicherstellen, dass nur positive Zahlen in das Perlscript eingesteuert werden. Das erste script schluckt auch Buchstaben usw. ...
 
OP
S

sphings

Member
notoxp schrieb:
Aber wenn du es unbedingt so und nicht anders brauchst, dann ändere den print wiefolgt ab:
Code:
 ... print "$cnt{$_}\n" ...


ja das war genau das richtige.
Aber ne kleine Hürde gibt es noch. ;)
er zählt korrekt allerdings darf er mir immer nur die hälfte anzeigen also anstatt 2 halt nur 1 oder anstatt 8 halt nur 4.
lässt sich das evntl auch noch einbauen?
von perl hab ich leider noch überhaupt keine ahnung ...
 

regexer

Advanced Hacker
sphings schrieb:
er zählt korrekt allerdings darf er mir immer nur die hälfte anzeigen also anstatt 2 halt nur 1 oder anstatt 8 halt nur 4.
lässt sich das evntl auch noch einbauen?
Code:
print $cnt{1}/2,"\n"
 
Oben