
효율적인 방법을 찾으려고 노력 중입니다.OverTheWire 산적 챌린지 레벨 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
저것~해야 한다원하는 것과 거의 비슷하지만 설명에 문자열이 포함될 수 있는 다른 파일 형식이 없다고 보장할 수 없습니다 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:~$
- 사람이 읽을 수 있는 (
ASCII text
) - 크기 1033바이트(
ls -l
출력에도 있음) - 실행할 수 없음(
-rw-r-----
)
답변4
find . -size 1033c ! -executable -exec file {} +