![사람이 읽을 수 있는 파일 찾기](https://linux55.com/image/95529/%EC%82%AC%EB%9E%8C%EC%9D%B4%20%EC%9D%BD%EC%9D%84%20%EC%88%98%20%EC%9E%88%EB%8A%94%20%ED%8C%8C%EC%9D%BC%20%EC%B0%BE%EA%B8%B0.png)
효율적인 방법을 찾으려고 노력 중이에요OverTheWire Bandit Challenge 레벨 5.
어쨌든 여러 개의 파일이 있지만 다음 기준을 충족하는 파일은 하나만 있습니다.
- 사람이 읽을 수 있는
- 크기는 1033바이트입니다.
- 시행 불가능
지금, 나는 사용하고 있습니다find
주문하다. 마지막 두 기준과 일치하는 파일을 찾을 수 있습니다.
find . -size 1033c ! -executable
그러나 사람이 읽을 수 없는 파일을 제외하는 방법을 모르겠습니다. 이 과제에 대해 제가 찾은 솔루션은 -readable
테스트 매개변수를 사용하지만 이것이 작동할 것이라고 생각하지 않습니다. -readable
내용은 볼 수 없고 파일의 권한만 볼 수 있으며, 챌린지 설명에서는 ASCII 파일 또는 이와 유사한 파일을 요청합니다.
답변1
예, find
올바른 크기의 실행 불가능한 파일을 찾은 다음 file
ASCII를 확인하는 데 사용할 수 있습니다. 그것은 다음과 같습니다:
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 -l
and 명령으로 확인 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:~$
- 사람이 읽을 수 있음(
ASCII text
) - 크기는 1033바이트입니다(
ls -l
출력에도 있음). - 실행 불가(
-rw-r-----
)
답변4
find . -size 1033c ! -executable -exec file {} +