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

У меня 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.A2003 003,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, но не мог понять, как их реализовать.

  • sudo tar изменяет права собственности на файлы неизвестного пользователя
  • Как найти отсутствующие файлы с последовательными именами?
  • Переименовать определенный уровень подпапок
  • Как искать папки с файлами .c вместе с Makefile? Я хочу, чтобы имена или содержимое папок
  • Перемещение уникальных файлов из папки с дубликатами файлов
  • Sphinx Search shutdown down после `FATAL: accept () не удалось: Слишком много открытых файлов`
  • Как запустить команду против всех файлов определенных типов в файловой системе?
  • Карта Home to External Drive
  • 4 Solutions collect form web for “Как напечатать имя отсутствующих файлов в папке?”

    С помощью 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} .

    Вариант решения @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 

    печатать только отсутствующий день + час

    Хотя ответ хаоса хорош для использования в интерактивных оболочках, этот может быть использован как сценарий 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 или brace не указывается POSIX.)

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

     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 .

    Interesting Posts

    pdf в JPG без потери качества; gscan2pdf

    Virtualbox, dkms, linux-header и virtualbox-dkms установлены, но говорят, что их не хватает?

    задержка записи в операционной файловой системе

    Удаление каталогов пользователей. в названии

    Как удалить записи по частоте трехстороннего взаимодействия с помощью awk

    Как я могу запускать программу в качестве другого пользователя во всех отношениях?

    Скрипт для преобразования каталога сценариев ksh в сценарии bash?

    rpc.statd работает в системе, не использующей NFS

    Как fcron знает, была ли выполнена работа?

    grep инвертированное соответствие по файлу, а не по строке по строке

    Автоматическое повторное подключение к Wi-Fi после отключения?

    Что может привести к изменению скорости порта USB?

    ls .. не работает должным образом с символическими ссылками

    Есть ли способ указать имя файла «/etc/apt/sources.list»?

    awk – читать программу И ввод со стандартного ввода?

    Linux и Unix - лучшая ОС в мире.