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

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

효율적인 방법을 찾으려고 노력 중입니다.OverTheWire 산적 챌린지 레벨 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저것~해야 한다원하는 것과 거의 비슷하지만 설명에 문자열이 포함될 수 있는 다른 파일 형식이 없다고 보장할 수 없습니다 text.

답변2

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

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

grep패턴을 찾을 수 없으면 0이 아닌 값을 반환하고 ( sh -c "COMMAND"유효한 경우) 평가 결과를 반환합니다. 따라서 이는 "UTF-8 유니코드 텍스트` 또는 "ASCII 텍스트"와 같이 file <filename>로 끝나는 것을 뱉어내는 파일만 인쇄 text하지만 "이스케이프 시퀀스가 ​​있는 비ISO 확장 ASCII 텍스트"는 인쇄하지 않습니다.

한 줄로 끝내면 다음보다 더 짧아집니다 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 -l및 명령 으로 확인 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 {} +

관련 정보