사람이 읽을 수 있는 파일 찾기

사람이 읽을 수 있는 파일 찾기

효율적인 방법을 찾으려고 노력 중이에요OverTheWire Bandit Challenge 레벨 5.

어쨌든 여러 개의 파일이 있지만 다음 기준을 충족하는 파일은 하나만 있습니다.

  • 사람이 읽을 수 있는
  • 크기는 1033바이트입니다.
  • 시행 불가능

지금, 나는 사용하고 있습니다find주문하다. 마지막 두 기준과 일치하는 파일을 찾을 수 있습니다.

find . -size 1033c ! -executable

그러나 사람이 읽을 수 없는 파일을 제외하는 방법을 모르겠습니다. 이 과제에 대해 제가 찾은 솔루션은 -readable테스트 매개변수를 사용하지만 이것이 작동할 것이라고 생각하지 않습니다. -readable내용은 볼 수 없고 파일의 권한만 볼 수 있으며, 챌린지 설명에서는 ASCII 파일 또는 이와 유사한 파일을 요청합니다.

답변1

예, find올바른 크기의 실행 불가능한 파일을 찾은 다음 fileASCII를 확인하는 데 사용할 수 있습니다. 그것은 다음과 같습니다:

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

그러나 문제는 말만큼 간단하지 않습니다. "사람이 읽을 수 있다"는 것은 매우 모호한 용어입니다. 아마도 텍스트를 의미하는 것 같습니다. 알겠습니다. 그런데 어떤 종류의 문자인가요? 라틴 문자 ASCII만 해당됩니까? 전체 유니코드? 예를 들어 다음 세 가지 파일을 고려해보세요.

$ cat file1
abcde
$ cat file2
αβγδε
$ cat file3
abcde
αβγδε
$ cat file4
#!/bin/sh
echo foo

이는 텍스트로 읽을 수도 있고 사람이 읽을 수도 있습니다. 이제 file그것이 무엇인지 살펴보겠습니다 :

$ file *
file1: ASCII text
file2: UTF-8 Unicode text
file3: UTF-8 Unicode text
file4: POSIX shell script, ASCII text executable

따라서 find위 명령은 찾기만 수행합니다 file1(이 예에서는 파일 길이가 1033자라고 가정합니다). 확장하여 find문자열을 찾을 수 있습니다 text.

find . -type f -size 1033c ! -executable -exec file {} + | grep -w text

를 사용하면 -w독립된 단어로 발견된 행만 인쇄됩니다 grep. text저것~해야 한다원하는 것과 거의 비슷하지만 설명에 string 이 포함될 수 있는 다른 파일 형식이 없다고 보장할 수 없습니다 text.

답변2

주로 발견된 파일에 대해 특정 작업을 수행하는 데 사용 되지만 -exec테스트로도 사용할 수 있습니다. 따라서 이를 다른 기준에 추가할 수 있습니다.

find . \
  -size 1033c \
  -not -executable \
  -exec sh -c 'file {} | grep "text$"' \;

grep패턴을 찾을 수 없으면 0이 아닌 값이 반환되고 평가 결과가 반환된다는 점을 기억하세요 sh -c "COMMAND"(유효한 한). 따라서 이는 "이스케이프 시퀀스가 ​​있는 비ISO 확장 ASCII 텍스트"가 아닌 "UTF-8 유니코드 텍스트" 또는 "ASCII 텍스트" file <filename>로 끝나는 파일 만 인쇄합니다 .text

한 줄에서는 over보다 훨씬 짧습니다 xargs.

find . -size 1033c -not -executable -exec sh -c 'file {} | grep "text$"' \;

sh -c 'file {} | grep "text$"'사용자 정의 명령을 대체할 수 있다는 점을 기억하십시오 . 매우 복잡한 것을 확인하려면 쉘 스크립트를 제공하여 사용하는 것이 좋습니다.

find . -size 1033c -not -executable -exec is_human_readable.sh {} \;

장기적으로는 쉘의 기록보다 유지 관리가 더 쉽습니다.

#!/bin/sh
file "$@" | grep "text$" > /dev/null

답변3

1033파일 크기는 1바이트에 불과합니다 .

bandit5@bandit:~$ find -size 1033c
./inhere/maybehere07/.file2
bandit5@bandit:~$ 

1033c안 돼 1033? 확인 man페이지

   -size n[cwbkMG]
          File uses n units of space, rounding up.  The following suffixes can be used:

          `b'    for 512-byte blocks (this is the default if no suffix is used)

          `c'    for bytes

          `w'    for two-byte words

          `k'    for Kilobytes (units of 1024 bytes)

          `M'    for Megabytes (units of 1048576 bytes)

          `G'    for Gigabytes (units of 1073741824 bytes)

ls -land 명령으로 확인 file하면 모든 답을 얻을 수 있습니다.

bandit5@bandit:~$ ls -l ./inhere/maybehere07/.file2
-rw-r----- 1 root bandit5 1033 May  7 20:15 ./inhere/maybehere07/.file2
bandit5@bandit:~$ 
bandit5@bandit:~$ file ./inhere/maybehere07/.file2
./inhere/maybehere07/.file2: ASCII text, with very long lines
bandit5@bandit:~$ 
  1. 사람이 읽을 수 있음( ASCII text)
  2. 크기는 1033바이트입니다( ls -l출력에도 있음).
  3. 실행 불가( -rw-r-----)

답변4

find . -size 1033c ! -executable -exec file {} +

관련 정보