Comment imprimer le nom des fichiers manquants dans un dossier?

8

J'ai plus de 2000 fichiers dans un dossier, mais il manque quelques fichiers dans le dossier.

Les noms des fichiers sont comme

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

001indique le jour, tandis que 0000l'heure est.

Comment savoir quel fichier manque dans le dossier? J'ai obtenu peu de réponses dans Google, mais je n'ai pas pu comprendre comment les mettre en œuvre.

Maria
la source
Vous voulez dire que chaque jour de 001 à xyz, il doit y avoir 4 fichiers: 0000, 0600, 1200 et 1800? Et sinon, ce nom devrait être imprimé? Dois-je comprendre cela correctement?
chaos
Dans * nix, nous les appelons des «répertoires», pas des dossiers. Dossiers est un terme Windows.
Rob
1
@chaos c'est 001 à 365 et oui vous avez compris mon point.
Maria
3
@Rob: meh. Les deux termes sont assez bien compris. En fait, Apple a probablement trouvé la métaphore du dossier à l'époque de la première version de MacOS avant même l'existence de MS Windows. Et comme comme nous savons tous que MacOS est UNIX, cela fait du dossier un terme UNIX :-)
Celada
2
Le dossier et le répertoire sont cependant des métaphores très différentes. Et les répertoires sous Unix se comportent très bien comme des répertoires dans la vie réelle et contrairement aux dossiers dans la vie réelle, tandis que les dossiers dans Windows se comportent beaucoup plus comme des dossiers réels que des répertoires réels, il est donc logique d'utiliser le terme qui plus étroitement ressemble au concept réel correspondant. J'ai personnellement vu une perte de données causée par un utilisateur pensant que les répertoires se comportaient comme des dossiers parce que ses professeurs les appelaient toujours des dossiers au lieu de répertoires.
Jörg W Mittag

Réponses:

13

Avec zshou bash4, vous pouvez utiliser l' extension d'accolade pour cela:

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

Remarquez les crochets:

  • {001..006}des moyens à développer 001, 002...006
  • {0000,0600,1200,1800}à chacun des add ci - dessus 0000, 0600, 1200et 1800.
  • >/dev/nullest d'éviter la sortie standard de ls-> nous voulons seulement une erreur standard

Maintenant, si un fichier n'est pas présent, lsaffichera une erreur pour cela:

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

Avec ksh93, remplacez {001..006}par {1..6%.3d}.

le chaos
la source
2
Cool .... + 1!
JJoao
Merci mais il y a 365 jours, donc {001..006} ne peut pas être développé dans cette mesure dans la commande. Que faire pour ça?
Maria
3
@Maria Pourquoi pas, avez-vous essayé {001..365}, pour moi ça marche
chaos
1
Voir aussi le {0000..1800..600}formulaire.
Stéphane Chazelas
Vous n'avez pas vraiment besoin des minutes de la liste. La deuxième extension du corset pourrait bien être .{00,06,12,18}00..
WAF du
7

Une variante de la solution @chaos (bash 4.0 ou supérieur ou zsh 4.3.11 et supérieur):

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

ou

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

pour imprimer uniquement le jour + l'heure manquants

JJoao
la source
4

Bien que la réponse du chaos soit bonne à utiliser dans des shells interactifs, celle-ci peut être utilisée comme script POSIX, par exemple si vous devez le faire périodiquement et / ou le faire sur un autre ordinateur.

#!/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

( seqou l'expansion d'accolade n'est pas spécifiée par POSIX.)

MichalH
la source
2

Générez les noms de fichiers dans une boucle, puis testez la non-existence d'un fichier:

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

Remarque: je ne garantis pas que cet exemple soit exempt d'erreurs. C'est un exemple, pas un script qui fonctionne.

La portabilité: les besoins ksh, bashou zshet un système avec la GNU seqcommande disponible.

John
la source
Le concept est également celui sur lequel j'ai convergé, mais veuillez noter que très peu de mois juliens ont 30 jours.
WAF du