"file" 명령의 출력을 기반으로 파일을 여는 방법

"file" 명령의 출력을 기반으로 파일을 여는 방법

따라서 해당 디렉토리에서 사람이 읽을 수 있는 유일한 파일을 열고 싶은 디렉토리가 있습니다. file *각 파일의 유형을 인쇄하는 데 사용하고 있는데 파일이 ASCII 텍스트로 표시됩니다. 해당 특정 파일을 cat 이하로 리디렉션하여 내용을 표시하려면 어떻게 해야 합니까?

편집하다:

당신은 모두 훌륭합니다. 나는 모두 노력하고 있습니다.

답변1

awk다음을 사용하여 ASCII 텍스트가 포함된 파일을 검색 할 수 있습니다 .

less $(file * | awk -F: '$2 ~ "ASCII text" {print $1}')

이는 실제로 여러 텍스트 파일이 포함된 디렉터리에서도 작동합니다.

답변2

다음 bash 함수는 현재 디렉터리에서 파일을 찾습니다. 그 중 하나가 "ASCII 텍스트"를 보고하면 해당 파일이 됩니다 cat.

filecat() {
  local files=(./*)
  local count=0
  local filename=
  local f=
  for f in "${files[@]}"
  do
    if file "$f" 2>/dev/null | grep -q ": ASCII text$"
    then
      count=$((count + 1))
      filename="$f"
    fi
  done
  if [ "$count" -eq 1 ]
  then
    cat "$filename"
  fi
}

답변3

를 사용하면 zsh다음과 같은 함수를 정의할 수 있습니다.

 istext() [[ $(file -b --mime-type -- "${1-$REPLY}") = text/* ]]

그런 다음 다음과 같은 전역 한정자에서 사용할 수 있습니다.

 less -- *(.L+0+istext)

현재 디렉터리에서 텍스트 형식이 인 비어 있지 않은( L+0길이가 0보다 큼) 일반 파일( )을 봅니다 ..file

답변4

lessASCII 텍스트 파일 에만 해당 :

less_if_text() {
   # $1 is the file name
   if file $1 | grep -q 'ASCII .* text' ; then
     less $1
   else
     echo "Not a text file: $1"
   fi
}

간단하지만 이해하기 쉬운 방식으로 텍스트 파일을 나열합니다.

ls_texts() {
  ls -a | while read filename; do 
    (file $filename | grep -q 'ASCII .* text') && echo $filename
  done
}

그러나 위의 속도는 그다지 빠르지 않습니다. file -f여러 file통화를 피하는 더 빠른 방법 grep:

ls_texts() {
  ls | file -f - | egrep ':\s+ASCII .* text' | while read fname
    do cut -d ':' -f 1 
  done
}

관련 정보