Как напечатать название отсутствующих файлов в папке?

8

У меня в папке более 2000 файлов, но в папке мало файлов.

Наименования файлов похожи

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

001указывает день, а 0000час.

Как узнать, какой файл отсутствует в папке? Я получил несколько ответов в Google, но не мог понять, как их реализовать.

Мария
источник
Вы имеете в виду, что каждый день с 001 до xyz должно быть 4 файла: 0000, 0600, 1200 и 1800? А если не то имя должно быть напечатано? Я правильно понимаю?
хаос
В * nix мы называем их «каталогами», а не папками. Папки - это термин Windows.
Роб
1
@ Хаос, это от 001 до 365 и да, вы поняли мою точку зрения.
Мария
3
@Rob: Мех. Оба термина довольно хорошо понятны. На самом деле, Apple, вероятно, придумала метафору папки во время первого выпуска MacOS еще до того, как появилась MS Windows. И поскольку мы все знаем, что MacOS - это UNIX, это делает папку термином UNIX :-)
Селада
2
Папка и каталог - это очень разные метафоры. И каталоги в Unix ведут себя очень похоже на каталоги в реальной жизни и в отличие от папок в реальной жизни, в то время как папки в Windows ведут себя гораздо больше как реальные папки, чем реальные каталоги, поэтому имеет смысл использовать термин, который более тесно напоминает соответствующую концепцию реальной жизни. Я лично видел потерю данных, вызванную тем, что пользователь думает, что каталоги ведут себя как папки, потому что его учителя продолжают называть их папками, а не каталогами.
Йорг Миттаг

Ответы:

13

С помощью zshили bash4вы можете использовать скобки для этого:

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

Обратите внимание на скобки:

  • {001..006}средства расширяться 001, 002...006
  • {0000,0600,1200,1800}к каждому из вышеуказанных оных 0000, 0600, 1200и 1800.
  • >/dev/nullчтобы избежать стандартного вывода ls-> мы хотим только стандартную ошибку

Теперь, если один файл отсутствует, lsпокажет ошибку для этого:

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

С ksh93, заменить {001..006}на {1..6%.3d}.

хаос
источник
2
Круто .... +1!
Жоао
Спасибо, но есть 365 дней, поэтому {001..006} нельзя расширить до такой степени в команде. Что для этого сделать?
Мария
3
@Maria Почему бы и нет, ты пробовал {001..365}, для меня это работает
хаос
1
Смотрите также {0000..1800..600}форму.
Стефан Шазелас
Вам не нужны минуты в списке. Второе расширение скобки может быть просто .{00,06,12,18}00..
WAF
7

Вариант решения @chaos (bash 4.0 или выше или zsh 4.3.11 и выше):

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

или

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

распечатать только пропущенный день + час

JJoao
источник
4

Хотя ответ хаоса можно использовать в интерактивных оболочках, его можно использовать в качестве сценария POSIX, например, если вам нужно делать это периодически и / или делать это на других компьютерах.

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

( seqили расширение скобки не указано в POSIX.)

MichalH
источник
2

Соберите имена файлов в цикле, а затем проверьте отсутствие файла:

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

Примечание. Я не гарантирую, что этот пример не содержит ошибок. Это пример, а не известный рабочий скрипт.

Переносимость: потребности ksh, bashили zshи система с GNU seqкоманды доступны.

Джон
источник
Это та концепция, к которой я также присоединился, но, пожалуйста, обратите внимание, что очень немногие юлианские месяцы имеют 30 дней.
WAF