Как напечатать имя отсутствующих файлов в папке?
У меня 2000 файлов в папке, но в папке нет файлов.
Название файлов похоже на
- Обнаружение размера файла и операция условно
- Как я могу переименовать много файлов с помощью регулярных выражений?
- удалить старый файл в каталоге
- Как снова сделать взломанные файлы в репозитории Subversion?
- Как ограничить скорость копирования файлов?
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
.