2000개가 넘는 파일이 있는 폴더가 있는데 폴더에서 여러 파일이 누락되었습니다.
파일 이름은 다음과 같습니다.
GLDAS_NOAH025SUBP_3H.A2003001.0000.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003001.0600.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003001.1200.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003001.1800.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003002.0000.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003002.0600.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003002.1200.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003002.1800.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003003.0000.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003003.0600.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003003.1200.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003003.1800.001.2015210044609.pss.grb
001
날짜를 나타내고 0000
시간을 나타냅니다.
폴더에 어떤 파일이 없는지 확인하는 방법은 무엇입니까? Google에서 답변을 거의 얻지 못했지만 이를 구현하는 방법을 모르겠습니다.
답변1
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
-> 우리는 stderr에 대해서만 stdout을 원합니다
이제 파일이 없으면 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}
답변2
@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
누락된 날짜+시간만 인쇄
답변3
하지만혼돈에 대한 답대화형 셸에서 사용하기에 이상적인 이 스크립트는 예를 들어 정기적으로 및/또는 다른 컴퓨터에서 이 작업을 수행해야 하는 경우 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
또는 POSIX는 중괄호 확장을 지정하지 않습니다.)
답변4
루프에서 파일 이름을 작성한 다음 파일이 존재하지 않는지 테스트하십시오.
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
또는 사용 가능한 GNU 명령이 있는 시스템이 bash
필요 합니다 .zsh
seq