¿Cómo imprimir el nombre de los archivos que faltan en una carpeta?

8

Tengo más de 2000 archivos en una carpeta, pero faltan algunos archivos de la carpeta.

El nombre de los archivos son como

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 día, mientras que 0000es la hora.

¿Cómo averiguar qué archivo falta en la carpeta? Obtuve pocas respuestas en google, pero no pude descubrir cómo implementarlas.

Maria
fuente
¿Quiere decir que todos los días de 001 a xyz debe haber 4 archivos: 0000, 0600, 1200 y 1800? ¿Y si no ese nombre debería ser impreso? ¿Entiendo esto correcto?
caos
En * nix, los llamamos 'directorios', no carpetas. Carpetas es un término de Windows.
Rob
1
@chaos son 001 a 365 y sí, ya entendiste mi punto.
Maria
3
@Rob: meh. Ambos términos se entienden bastante bien. En realidad, Apple probablemente presentó la metáfora de la carpeta en el momento del primer lanzamiento de MacOS antes de que MS Windows existiera. Y como todos sabemos que MacOS es UNIX, eso hace de la carpeta un término UNIX :-)
Celada
2
Sin embargo, la carpeta y el directorio son metáforas muy diferentes. Y los directorios en Unix se comportan de manera muy similar a los directorios en la vida real y a diferencia de las carpetas en la vida real, mientras que las carpetas en Windows se comportan mucho más como las carpetas de la vida real que los directorios de la vida real, por lo que tiene sentido usar el término que más de cerca se asemeja al concepto correspondiente de la vida real. Personalmente, he visto la pérdida de datos causada por un usuario que pensaba que los directorios se comportaban como carpetas porque sus maestros los llamaban carpetas en lugar de directorios.
Jörg W Mittag

Respuestas:

13

Con zsho bash4, puede usar la expansión de llaves para eso:

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

Observe los corchetes:

  • {001..006}medios se expanden para 001, 002, ...006
  • {0000,0600,1200,1800}a cada uno de los add anterior 0000, 0600, 1200y 1800.
  • >/dev/nulles evitar la salida estándar de ls-> solo queremos un error estándar

Ahora, si un archivo no está presente, lsmostrará un error para eso:

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, reemplazar {001..006}con {1..6%.3d}.

caos
fuente
2
Genial .... + 1!
JJoao
Gracias pero hay 365 días, por lo que {001..006} no se puede ampliar hasta ese punto en el comando. ¿Qué hacer para esto?
Maria
3
@Maria ¿Por qué no? ¿Lo has intentado? {001..365}Para mí funciona
Caos
1
Ver también el {0000..1800..600}formulario.
Stéphane Chazelas
Realmente no necesitas los minutos en la lista. La segunda expansión de llaves podría ser .{00,06,12,18}00..
WAF
7

Una variación de la solución @chaos (bash 4.0 o superior o zsh 4.3.11 y superior):

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

para imprimir solo el día faltante + hora

JJoao
fuente
4

Si bien la respuesta del caos es buena para usarse en shells interactivos, esta puede usarse como un script POSIX, por ejemplo, si necesita hacerlo periódicamente y / o hacerlo en otras computadoras.

#!/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 POSIX no especifica la expansión de llaves).

MichalH
fuente
2

Cree los nombres de archivo en un bucle y luego pruebe la inexistencia de un archivo:

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: no garantizo que este ejemplo esté libre de errores. Es un ejemplo, no un script de trabajo conocido.

Portabilidad: necesidades ksh, basho zshy un sistema GNU con el seqcomando disponibles.

Juan
fuente
El concepto es el que también convergí, pero tenga en cuenta que muy pocos meses julianos tienen 30 días.
WAF