폴더에서 누락된 파일 이름을 인쇄하는 방법은 무엇입니까?

폴더에서 누락된 파일 이름을 인쇄하는 방법은 무엇입니까?

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필요 합니다 .zshseq

관련 정보