"손상된" 파일을 찾으려면 find 명령에 if를 중첩하십시오.

"손상된" 파일을 찾으려면 find 명령에 if를 중첩하십시오.

디렉터리 구조에서 "손상된" 파일, 즉 파일 명령이 "데이터"로 해석하는 파일을 찾으려고 합니다. 이것은 내가 실행하려고 시도했지만 실패한 명령입니다.

$ find . -type f -exec if [[ $(file \{} | cut -f2 -d':') == " data" ]] \; then echo " \{}  is CORRUPT" \; else echo " \{} is DATA" \; fi \;
find: paths must precede expression: then

내가 여기서 뭘 잘못하고 있는지 아는 사람 있나요?

나는 if내부의 매개변수를 본 적이 없다는 것을 깨달았습니다 -exec. 가능합니까?

기본적으로 저는 해당 기준과 일치하는 파일(파일이 특정 파일 형식을 식별하지 않고 "데이터"로 보고함)을 찾은 다음 삭제하기 전에 분석할 수 있도록 나열하려고 합니다.

답변1

이러한 구성을 해석하거나 이러한 파이프를 실행하려면 셸이 필요합니다 if/then/else(여기서는 실제로 필요하지 않지만).

find . -type f -exec sh -c '
  for file do
    case $(file -b "$file") in
      (data) printf "%s is CORRUPT\n" "$file";;
         (*) printf "%s is DATA\n" "$file";;
    esac
  done' sh {} +

file(귀하의 질문과 마찬가지로 라고 하면 "CORRUPT"가 인쇄됩니다 data. 하지만 그게 무슨 뜻인지 잘 모르겠습니다.)

무엇을 하든 {}다른 사람들이 제안한 것처럼 쉘 코드에 포함하지 마십시오! 예를 들어 이름이 지정된 파일을 $(rm -rf "$HOME")사용하면 전체 홈 디렉터리를 삭제할 수 있으므로 이는 매우 위험하며 이식성이 없습니다 .

답변2

제목에 대한 정확한 답변은 아니지만(찾기에 있는 경우 중첩됨) 모든 목적에 있어서 이는 찾기에 전체 쉘 스크립트를 삽입하는 것보다 더 나은 솔루션입니다.

또한 제네릭 내부에서는 sh테스트가 [[작동하지 [않고 =. 따라서 bash 쉘이 필요합니다. 이미 bash 쉘을 사용하고 있다면 별 의미가 없습니다. 어쨌든 이것은 새 쉘을 시작하는 것보다 빠릅니다.

#!/bin/bash
while IFS= read -rd '' file; do
    if [[ $(file "$file" | cut -f2 -d':') =~ " data" ]]; then
        printf "%s is CORRUPT\n" "$file"
    else
        printf "%s is DATA\n" "$file"
    fi
done < <(find . -type f -print0)

참고: PNG 이미지(또는 유사한 이미지)의 텍스트를 일치시키려는 경우 ' data'==를 =~로 변경합니다.

$ file TrueTable-1.png| cut -f2 -d':'
PNG image data, 405 x 292, 8-bit colormap, non-interlaced

이 가정이 잘못된 경우 의견을 말해주세요.

관련 정보