Come stampare il nome dei file mancanti in una cartella?


8

Ho più di 2000 file in una cartella, ma mancano pochi file nella cartella.

Il nome dei file è simile

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

001indica il giorno, mentre 0000è l'ora.

Come scoprire quale file manca nella cartella? Ho avuto poche risposte su Google, ma non sono riuscito a capire come implementarle.


Vuoi dire, ogni giorno da 001 a XYZ ci devono essere 4 file: 0000, 0600, 1200 e 1800? E se no quel nome dovrebbe essere stampato? Lo capisco correttamente?
caos,

In * nix, li chiamiamo 'directory', non cartelle. Cartelle è un termine di Windows.
Rob,

1
@chaos sono 001 a 365 e sì, hai capito bene.
Maria,

3
@Rob: meh. Entrambi i termini sono abbastanza ben compresi. In realtà, Apple probabilmente ha inventato la metafora della cartella all'epoca della prima versione di MacOS prima ancora che esistesse MS Windows. E poiché, come tutti sappiamo, MacOS è UNIX, che rende la cartella un termine UNIX :-)
Celada,

2
Cartella e directory sono metafore molto diverse, però. E le directory in Unix si comportano in modo molto simile alle directory nella vita reale e diversamente dalle cartelle nella vita reale, mentre le cartelle in Windows si comportano in modo molto più simile alle cartelle della vita reale che alle directory della vita reale, quindi ha senso usare il termine che più da vicino ricorda il corrispondente concetto di vita reale. Ho visto personalmente la perdita di dati causata da un utente pensando che le directory si comportassero come cartelle perché i suoi insegnanti continuavano a chiamarle cartelle anziché directory.
Jörg W Mittag,

Risposte:


13

Con zsho bash4, è possibile utilizzare l' espansione del controvento per questo:

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

Notare le parentesi:

  • {001..006}mezzi espandono 001, 002...006
  • {0000,0600,1200,1800}a ciascuno di quanto sopra aggiuntivo 0000, 0600, 1200e 1800.
  • >/dev/nullè per evitare l'output standard di ls-> vogliamo solo errori standard

Ora se un file non è presente, lsmostrerà un errore per quello:

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

Con ksh93, sostituire {001..006}con {1..6%.3d}.


2
Cool .... + 1!
JJoao,

Grazie ma ci sono 365 giorni, quindi {001..006} non può essere espanso fino a quel punto nel comando. Cosa fare per questo?
Maria,

3
@Maria Perché no, ci hai provato {001..365}, per me funziona
caos

1
Vedi anche il {0000..1800..600}modulo.
Stéphane Chazelas,

Non hai davvero bisogno dei minuti nell'elenco. La seconda espansione di parentesi potrebbe essere .{00,06,12,18}00..
WAF,

7

Una variazione sulla soluzione @chaos (bash 4.0 o successive o zsh 4.3.11 e successive):

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

o

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

per stampare solo il giorno + l'ora mancanti


4

Mentre la risposta del caos è buona da usare nelle shell interattive, questa può essere usata come uno script POSIX, ad esempio se è necessario farlo periodicamente e / o farlo su un altro computer.

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

( seqo l'espansione del controvento non è specificata da POSIX.)


2

Costruire i nomi dei file in un ciclo e quindi verificare la non esistenza di un file:

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

Nota: non garantisco che questo esempio sia privo di errori. È un esempio, non uno script funzionante.

Portabilità: bisogni ksh, basho zshed un sistema con la GNU seqcomando disponibili.


Il concetto è anche quello su cui sono converto, ma per favore nota che pochissimi mesi giuliani hanno 30 giorni.
WAF,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.