디렉터리 구조에서 "손상된" 파일, 즉 파일 명령이 "데이터"로 해석하는 파일을 찾으려고 합니다. 이것은 내가 실행하려고 시도했지만 실패한 명령입니다.
$ 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
이 가정이 잘못된 경우 의견을 말해주세요.