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

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

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

  • Можно ли загрузить файл ссылки из веб-каталога?
  • Печать и удаление первой строки файла с помощью `sed`
  • Почему копирование с винта скрипта с моими файлами?
  • Лучший способ убить все процессы с помощью дескриптора некоторого файла
  • Поиск файлов в соответствии с метатегами PNG
  • Права на наследование файлов каталога, на которые он скопирован?
  • 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, но не мог понять, как их реализовать.

  • Удалите поврежденный файл в системе Linux
  • Соответствие двух файлов для аналогичной первой строки
  • Отображать цвета в сценарии оболочки
  • cURL доступ к сайту HTTPS
  • как просмотреть разрешение на каталоги
  • строка командной строки не найдена
  • 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 .

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