매직 모드를 통해 파일 찾기

매직 모드를 통해 파일 찾기

/etc/magic 및 /usr/share/misc/magic의 일치하는 패턴을 기반으로 출력 파일의 콘텐츠 유형을 정의하는 bash 명령 파일(1)이 있습니다.

"find" 명령에 대한 테스트로 이러한 패턴을 사용하여 "마법" 파일을 정의하는 방법이 있습니까?

예를 들어 텍스트 파일과 "PalmOS 응용 프로그램" 파일이 있습니다.

file -b palmapp
PalmOS application

file -b readme.txt
ASCII text

"ASCII 텍스트" 대신 "PalmOS 응용 프로그램"과 일치하는 파일을 찾으려면 몇 가지 방법이 필요합니다. 예를 들어 다음은 이상적인 명령입니다.

find . -magic "PalmOS*"

이 테스트를 위해 각 파일에 대해 한 줄짜리 bash 명령을 작성하는 방법에 대한 아이디어가 있습니까?

답변1

대략 다음과 같습니다.

find . -print -exec file {} \; | grep "PalmOS"

awk를 통해 출력을 파이프하려면 다음을 추가하세요.

| awk '{print substr($1,2,length($1)-2)}'

답변2

find파일 내용을 분석하는 내장 기능은 없지만 file셸을 사용하여 여러 작업별 프로그램을 결합하는 것( find디렉토리 트리 탐색, file파일 내용 분석)은 Unix 방식으로 작업을 수행합니다.

file -b -- "$filename"명령의 출력에 문자열이 포함된 파일에 대해 작업을 수행 하려고 합니다 PalmOS application. 쉘 스크립트로 테스트할 수 있습니다.

case "$(file -b -- "$filename")" in *"PalmOS application"*) true;; *) false;; esac

find이 스크립트를 다음과 같은 명령과 함께 사용할 수 있습니다.

find . -type f -exec sh -c 'case "$(file -b "$0")" in *"PalmOS application"*) true;; *) false;; esac' {} \; -print

-print수행하려는 작업으로 바꾸십시오 (다른 작업일 수도 있음 -exec …). 두 번째 작업은 이전 작업이 true인 경우에만 실행됩니다(즉, 쉘 명령은 0(true)을 반환함).

또는 zsh에서 다음을 사용하여 쉘이 디렉토리 탐색을 수행하도록 할 수 있습니다.**전반적인 상황. 이것. 글로벌 예선일반 파일(예: )에 대한 일치를 제한 -type f합니다 find.

for x in **/*(.); do
  [[ $(file -b -- $x) = *"PalmOS application"* ]] || continue
done

Bash ≥4.3에서는 재귀 와일드카드를 사용할 수 있지만 먼저 해당 옵션을 활성화 **해야 합니다 . globstarBash 4.0~4.2에서는 globstar이미 사용 가능하지만 **디렉터리 심볼릭 링크를 탐색할 때는 주의하세요. set -o globstarksh93 에서는 shopt -s globstar.

shopt -s globstar
for x in **/*; do
  [[ -f $x ]] || continue
  [[ $(file -b -- "$x") = *"PalmOS application"* ]] || continue
done

파일 이름에 공백이나 공백이 포함되어 있지 않은 경우 :\"'다른 접근 방식은 파일 이름에 대해 실행 file하고 출력을 구문 분석하는 것입니다.

find -type f |
xargs file |
sed -n 's/:.*PalmOS application.*//p' |
xargs somecommand

파일 이름에 공백이 포함되어 있지만 줄 바꿈이나 콜론이 없으면 셸을 사용하여 구문 분석할 수 있습니다.

find -type f |
while IFS=: read -r filename type; do
  case "$type" in
    *"PalmOS application"*)
      …;;
  esac
done

답변3

이는 을 사용하지 않지만 질문이 요구하는 결과를 find설정 pattern하고 생성합니다 .directory

pattern="PalmOS application"
directory=.

for f in $directory/*; do
    if [[ $(file -b $f) == "$pattern" ]]; then
        echo $f; 
    fi; 
done

관련 정보