확장자별로 중복된 파일을 찾아서 삭제하는 스크립트

확장자별로 중복된 파일을 찾아서 삭제하는 스크립트

최근 내 NAS가 랜섬웨어의 공격을 받아 모든 파일이 7z도난당했습니다. 비밀번호를 알아내고 추출하는 동시에 이름을 바꿨습니다.7 압축파일을 삭제합니다 ( 공격 이전에 이미 갖고 있던 실제 파일 7z.bad이 아니라 나중에 영향을 받은 파일을 더 쉽게 삭제할 수 있도록 하기 위해 )..7z

파일을 추출하고 이름을 바꾸는 데 사용하는 스크립트는 다음과 같습니다.

while [ -n "$(find . -type f -name '*.7z' -print -quit)" ]
do 
    find . -type f -name "*.7z" -execdir /usr/local/sbin/7z x -pPASSWORD {} \; -execdir mv {} {}".bad" \;
done

그래서 제가 지금 가지고 있는 것은 다음과 같이 많은 중복입니다.

Phone book.xlsx
Phone book.xlsx.7z.bad

내가 하고 싶은 일은:

  1. .7z.bad현재 디렉터리(및 모든 하위 디렉터리)에서 파일을 찾습니다 .
  2. 발견된 파일 의 경우 .7z.bad,만약에.7z.bad 확장자가 없는 동일한 파일도 존재합니다.
  3. .7z.bad파일 삭제

원본 파일이 존재하는지 확인하려는 이유는 단지 보안 수준을 한 단계 더 추가하기 위함입니다.

fdupesQnap NAS에 다른 도구(예를 들어)를 설치할 수 없을까 걱정됩니다 .

답변1

find . -type f -exec sh -c 'for name do rm -f -- "$name.7z.bad"; done' sh {} +

위의 결과모두현재 디렉토리 안이나 아래의 일반 파일을 삭제한 다음 모두 삭제하고 .7z.bad이름 끝에 먼저 추가하십시오.

이렇게 하면 .7z.bad해당 파일 이름 접미사가 없는 해당 파일이 있는 경우 이름이 로 끝나는 모든 파일이 삭제됩니다.

빈 디렉터리에서 테스트합니다.

$ touch file-{1..5}.txt.7z.bad
$ touch file-{1..3}.txt
$ ls
file-1.txt        file-2.txt        file-3.txt        file-4.txt.7z.bad
file-1.txt.7z.bad file-2.txt.7z.bad file-3.txt.7z.bad file-5.txt.7z.bad
$ find . -type f -exec sh -c 'for name do rm -f -- "$name.7z.bad"; done' sh {} +
$ ls
file-1.txt        file-2.txt        file-3.txt        file-4.txt.7z.bad file-5.txt.7z.bad

답변2

find . -type f -name "*.7z.bad" -exec sh -c '
  for file; do
    if [ -f "${file%.7z.bad}" ]; then
      rm -- "$file"
    else
      echo "keeping file $file" >&2
    fi
  done
' sh {} +

이는 찾은 모든 파일 이름을 find쉘 스크립트에 전달한 다음 파일 이름을 반복하여 .7z.bad접미사가 없는 각 파일 이름이 존재하는지 확인합니다. 이 경우 접미사가 붙은 파일을 삭제하고 .7z.bad, 그렇지 않으면 경고 메시지를 인쇄합니다.

-f사용. . . 대신 -s압축이 풀린 파일이 있는지 테스트하려면,그리고파일 크기가 0이 아닙니다.

관련 정보