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

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

  • Условные утверждения: поиск папок, которые не содержат определенного файла
  • Есть ли способ удалить дубликаты, более совершенные, чем fdupes -rdN?
  • Как мне заставить «sudo ll» работать?
  • Как работает `stdin` linux?
  • В сценарии оболочки выполните команду, только если источник более новый, чем целевой
  • В чем разница между жесткими ссылками и скопированными файлами?
  • Резервное копирование файлов
  • Удалите 50GB самых старых файлов в busybox, когда используемая емкость достигает 95%
  • 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

    как удалить строки с менее чем двумя столбцами в файле данных в Linux?

    Перенаправление трафика вторичного сетевого интерфейса вместе с переадресацией портов на tun0 (OpenVPN) с использованием iptables

    Установка устройства без разрешения на чтение

    Что указывают разные элементы версии в имени debian?

    Сценарий Bash для минимизации PNG продолжает останавливаться

    Возвратная перевозка не работает (Экран)

    почему в Linux нет монитора, указанного в / dev?

    Как устранить старые приложения X, работающие неправильно на современных X-серверах?

    Lenovo g580 Перегрев с помощью Fedora 25

    Как я могу использовать два загрузочных дистрибутива Linux, сохраняя один в качестве основного и постоянно меняя второй?

    Можно ли вывести две конкретные вещи вывода?

    systemd и несколько экземпляров haproxy

    Может ли веб-сервер Apache отвечать на запросы SMTP / IMAP / POP3?

    Как я могу отфильтровать эти «Permission denied» из вывода вывода?

    Ссылка на имя пути в результатах поиска `find`

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