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

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

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 .

  • Операции только с полными файлами
  • Как я могу предоставить файлы расширенных атрибутов в mac os x?
  • Как передать файл по протоколу Windows Share из научного Linux?
  • Файл, содержащий структуру каталогов
  • Показать содержимое многих файлов
  • Файлы, отсутствующие на диске и диске NTFS, разделены на многие
  • Сценарий оболочки: «если файл не используется»
  • необходимо переместить файлы в другую папку на основе даты создания
  • Запретить обработку файла до завершения передачи по протоколу SCP
  • Поиск и копирование каталогов, содержащих тип файла
  • Удалить все файлы путем поиска
  • Linux и Unix - лучшая ОС в мире.