나는 다음과 같은 디렉토리 구조를 가지고 있습니다
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
에 전달되며, 스크립트는 해당 스크립트에서 실행되고 실패 시 오류를 표시합니다. 모든 오류 메시지를 삭제하여 깔끔하게 유지하세요.sh
bzip -t
2>/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
.