Wie drucke ich den Namen fehlender Dateien in einem Ordner?

8

Ich habe mehr als 2000 Dateien in einem Ordner, aber es fehlen nur wenige Dateien im Ordner.

Name der Dateien sind wie

GLDAS_NOAH025SUBP_3H.A2003 001,0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001,0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001,1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001,1800 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002,0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002,0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002,1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002,1800 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003,0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003003.0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003.1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003.1800 .001.2015210044609.pss.grb

001zeigt den Tag an, während 0000die Stunde ist.

Wie finde ich heraus, welche Datei im Ordner fehlt? Ich habe nur wenige Antworten in Google erhalten, konnte aber nicht herausfinden, wie ich diese implementieren soll.

Maria
quelle
Sie meinen, jeden Tag von 001 bis xyz müssen 4 Dateien vorhanden sein: 0000, 0600, 1200 und 1800? Und wenn nicht, sollte dieser Name gedruckt werden? Verstehe ich das richtig
Chaos
In * nix nennen wir sie "Verzeichnisse", keine Ordner. Ordner ist ein Windows-Begriff.
Rob
1
@chaos es ist 001 bis 365 & ja du hast meinen Punkt verstanden.
Maria
3
@ Rob: meh. Beide Begriffe sind ziemlich gut verstanden. Wahrscheinlich hat Apple die Ordner-Metapher etwa zur Zeit der ersten Veröffentlichung von MacOS entwickelt, bevor es MS Windows überhaupt gab. Und da, wie wir alle wissen, MacOS UNIX ist, ist Ordner ein UNIX-Begriff :-)
Celada
2
Ordner und Verzeichnis sind jedoch sehr unterschiedliche Metaphern. Und Verzeichnisse in Unix verhalten sich sehr ähnlich wie Verzeichnisse im realen Leben und anders als Ordner im realen Leben, während sich Ordner in Windows viel mehr wie reale Ordner als echte Verzeichnisse verhalten. Daher ist es sinnvoll, den Begriff genauer zu verwenden ähnelt dem entsprechenden realen Konzept. Ich habe persönlich einen Datenverlust gesehen, der durch einen Benutzer verursacht wurde, der dachte, Verzeichnisse hätten sich wie Ordner verhalten, weil seine Lehrer sie weiterhin Ordner anstelle von Verzeichnissen nannten.
Jörg W Mittag

Antworten:

13

Mit zshoder bash4können Sie dafür die Klammererweiterung verwenden :

ls -d GLDAS_NOAH025SUBP_3H.A2003{001..006}.{0000,0600,1200,1800}.001.2015210044609.pss.grb >/dev/null

Beachten Sie die Klammern:

  • {001..006}Mittel erweitern 001, 002...006
  • {0000,0600,1200,1800}zu jedem der oben genannten Add 0000, 0600, 1200und 1800.
  • >/dev/nullUm die Standardausgabe von ls-> zu vermeiden, wollen wir nur Standardfehler

Wenn nun eine Datei nicht vorhanden ist, lswird ein Fehler angezeigt:

ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.0000.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.0600.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.1200.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.1800.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.0000.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.0600.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.1200.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.1800.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.0000.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.0600.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.1200.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.1800.001.2015210044609.pss.grb: No such file or directory

Mit ksh93ersetzen {001..006}durch {1..6%.3d}.

Chaos
quelle
2
Cool .... + 1!
JJoao
Vielen Dank, aber es gibt 365 Tage, sodass {001..006} im Befehl nicht in diesem Umfang erweitert werden kann. Was tun?
Maria
3
@ Maria Warum nicht, haben Sie versucht {001..365}, für mich funktioniert es
Chaos
1
Siehe auch das {0000..1800..600}Formular.
Stéphane Chazelas
Sie brauchen die Minuten in der Liste nicht wirklich. Die zweite Klammererweiterung könnte einfach sein .{00,06,12,18}00..
WAF
7

Eine Variation der @ chaos-Lösung (bash 4.0 oder höher oder zsh 4.3.11 und höher):

for a in GL.....2003{001..365}.{00..18..6}00.001.2015210044609.pss.grb 
do  
  [[ -f $a ]] || echo "$a"
done

oder

for a in {001..365}.{00..18..6}
do
  [[ -f "GL.....2003${a}00.001.2015210044609.pss.grb" ]] || echo "$a"
done

um nur den fehlenden Tag + Stunde zu drucken

JJoao
quelle
4

Während die Antwort von Chaos gut ist, um in interaktiven Shells verwendet zu werden, kann diese als POSIX-Skript verwendet werden, beispielsweise wenn Sie dies regelmäßig und / oder auf einem anderen Computer tun müssen.

#!/bin/sh
i=0
while test "$((i+=1))" -lt 366 ; do
    for j in 00 06 12 18 ; do
        file="GLDAS_NOAH025SUBP_3H.A2003$(printf '%03d' "$i").${j}00.001.2015210044609.pss.grb"
        test -e "$file" || echo "$file"
    done
done

( seqoder Klammererweiterung wird von POSIX nicht angegeben.)

MichalH
quelle
2

Erstellen Sie die Dateinamen in einer Schleife und testen Sie dann, ob eine Datei nicht vorhanden ist:

for day in `seq -f "%03g" 1 30`
  do
  for hour in 0000 0600 1200 1800
    do
    filename="GLDAS_NOAH025SUBP_3H.A2003${day}.${hour}.001.2015210044609.pss.grb"
    if [[ ! -e $filename ]]
    then
      echo "File missing: $filename"
    fi
  done
done

Hinweis: Ich garantiere nicht, dass dieses Beispiel fehlerfrei ist. Es ist ein Beispiel, kein bekannt funktionierendes Skript.

Portabilität: Bedürfnisse ksh, bashoder zshund ein System , mit der GNU - seqBefehl zur Verfügung.

John
quelle
Das Konzept ist das, auf das ich mich auch konzentriert habe, aber bitte beachten Sie, dass nur sehr wenige julianische Monate 30 Tage haben.
WAF