폴더 및 하위 폴더에서 손상된 파일 목록 가져오기

폴더 및 하위 폴더에서 손상된 파일 목록 가져오기

나는 다음과 같은 디렉토리 구조를 가지고 있습니다

folder
└── 01
    ├── test1
        └── abc.bz2
        └── asd.bz2
    ├── test2
        └── 546.bz2
        └── alsj.bz2
    ├── test3
        └── aewr.bz2
        └── hlk.bz2
    └── test4
        └── oiqw.bz2
        └── abc.bz2
└── 02
    ├── test1
    ├── test2
    ├── test3
    └── test4
└── 03
    ├── test1
    ├── test2
    ├── test3
    └── test4
.
.
└── 31

모든 test1..4디렉토리에는 원격 서버에서 복사된 많은 수의 bzip 파일이 포함되어 있습니다. bzip2 -t <filename.bz2>파일이 손상되었는지 확인하는 명령을 알고 있지만 위 폴더 구조에서 손상된 파일을 모두 확인해야 합니다. 그렇다면 손상된 모든 파일 목록을 얻기 위해 쉘 스크립트를 어떻게 작성합니까? 저는 쉘 스크립팅과 Linux를 처음 접했기 때문에 도움을 주시면 대단히 감사하겠습니다.

답변1

그냥 find사용하십시오 -exec:

find . -name '*bz2' -exec sh -c 'bzip2 -t "$0" 2>/dev/null || echo "$0 is corrupted"' {} \;

에서 man find:

  -exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of `;' is encountered.  The string `{}'
          is replaced by the current file name being processed  everywhere
          it occurs in the arguments to the command [...]

따라서 위 명령은 로 끝나는 모든 파일을 찾아 find각 파일에서 bz2작은 스크립트를 시작합니다 . 발견된 각 파일 이름으로 대체됩니다 sh. {}이는 첫 번째 인수( )로 스크립트 $0에 전달되며, 스크립트는 해당 스크립트에서 실행되고 실패 시 오류를 표시합니다. 모든 오류 메시지를 삭제하여 깔끔하게 유지하세요.shbzip -t2>/dev/null


또는 셸을 사용할 수도 있습니다. 를 사용하는 경우 하위 디렉터리로 재귀 하는 옵션을 bash활성화 하고 각 bzip 파일을 확인합니다.globstar**

shopt -s globstar
for file in folder/**/*bz; do bzip2 -t "$file" || echo "$file is corrupted"; done

답변2

아래 스크립트를 사용해 주세요.

cd folder
find -name "*.bz2" > bzipfiles
for i in `cat bzipfiles`
do
    bzip2 -t $i
    if [ $? == '0']
    then
        echo "$i file is not corrupted"
    else
        echo "$i file is corrupted"
        echo "$i" >> corruptedfile_list
    fi
done

에서 손상된 파일 목록을 찾으십시오 corruptedfile_list.

관련 정보