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


14

OverTheWire 산적 도전의 5 단계 를 수행하는 효율적인 방법을 찾으려고 노력하고 있습니다.

어쨌든, 나는 많은 파일을 가지고 있으며 다음 기준을 준수하는 파일 만 있습니다.

  • 사람이 읽을 수있는
  • 1033 바이트 크기
  • 비 실행

지금은 find명령을 사용하고 있으며 두 가지 마지막 기준과 일치하는 파일을 찾을 수 있습니다.

find . -size 1033c ! -executable

그러나 사람이 읽을 수없는 파일을 제외시키는 방법을 모르겠습니다. 그 도전에 대해 찾은 솔루션은 -readable테스트 매개 변수를 사용하지만 이것이 효과가 있다고 생각하지 않습니다. -readable챌린지 설명은 ASCII 파일 또는 이와 유사한 것을 요청하는 반면 파일의 내용이 아닌 파일의 권한 만 봅니다.


1
사람이 읽을 수있는 방법을 어떻게 정의합니까? 바이너리가 아닙니까?
terdon

2
file command is your friend :)
Romeo Ninov


3
인간은 지구상에서 가장 지능적으로 알려진 종 중 하나입니다. 그들은 또한 컴퓨터에 정통한 것으로 알려진 유일한 사람입니다. 암호화 된 키의 유형을 확인하고 암호화 키를 보유 할 수 있으면 대부분의 파일을 읽을 수 있습니다.
Stéphane Chazelas

1
스포일러 경고!!
Dan Bolser

답변:


17

예, 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.


4

-exec찾은 파일을 사용하여 무언가를 수행하는 데 주로 사용 되지만 테스트 역할을 할 수도 있습니다. 따라서 다른 기준에 추가 할 수 있습니다.

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

기억 grep반환 비제 패턴이 발견되지 않았으며 sh -c "COMMAND"(한이 유효의로) 평가의 결과를 반환합니다. 따라서 이것은 "UTF-8 유니 코드 텍스트"또는 "ASCII 텍스트"로 끝나지만 "이스케이프 시퀀스가있는 비 ISO 확장 ASCII 텍스트"가 아닌 file <filename>뱉음이있는 파일 만 인쇄합니다 text.

한 줄로 넘어가는 것보다 짧습니다 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

좋은! 그러나 일치 text$하면 셸 스크립트로 인식되는 항목은 제외됩니다. shebang이있는 것은 스크립트로 식별되며 사람이 읽을 수 있습니다.
terdon

@terdon true이지만 스크립트는 실행 가능한 경향이 있습니다. : D. 그러나 적절한 스크립트는 PDF도 인식해야합니다. 그러나 다른 한편으로, 사람이 읽을 수 있는 이미지를 포함하는 PDF는 ? 일부 텍스트의 PNG를 읽을 수 있습니까? 아마. 나는 complet 시험이… 도전적 일 것이다라고 생각한다.
Zeta


1

다음을 사용해야합니다.

find inhere -size 1033c

암호가 포함 된 유일한 파일을 제공합니다.


+ 1033c가 더 많은 파일을 반환하는 이유는 무엇입니까? 그것이 더 크거나 같은 표시입니까?
szeitlin

1

디렉토리의 내용에 대해 다음을 실행하십시오.

$ file -- *
-file00: data
-file01: data
-file02: data
-file03: data
-file04: data
-file05: data
-file06: data
-file07: ASCII text
-file08: data
-file09: data
$ cat -- \-file07
<output>

0
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: '{print $1}'

이 결합 된 명령을 시도하십시오. 내 역에서 작동합니다.


0

당신은 이것을 시도 할 수 있습니다

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

당신의 도전은 허용하지 않습니다 grep. 비밀번호 파일은 "매우 긴 행이있는 ASCII 텍스트"로보고됩니다.


0

사람이 읽을 수있는 파일 이름을 필터링하려면 [:print:]( 인쇄 가능 ) 문자 클래스 이름 을 사용할 수 있습니다 . 해당 클래스에 대한 자세한 내용은에 대한 매뉴얼을 참조하십시오 grep.

find . -type f -size 1033c -name "[[:print:]]*" ! -executable

다시 한 번 생각하면 "사람이 읽을 수있는"요구 사항은 파일 이름 대신 파일의 내용을 참조 할 수 있습니다. 즉, 텍스트 파일을 검색하는 것 입니다. 좀 더 까다 롭습니다. 주석에서 @D_Bye가 제안한 것처럼 file명령을 사용하여 파일 내용 유형을 결정해야합니다. 그러나 file파일 이름을 표시하는 작업이 복잡해 지므로 파이프 다음 에 실행하는 것은 좋지 않습니다 . 내가 제안하는 것은 다음과 같습니다.

find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print

다음은 file-part의 작동 방식입니다.

  • -exec술어가 실행 sh -c 'file -b $0 | grep -q text' FILENAME각각 FILENAME만족 이전의 모든 조건 (종류, 사이즈, 비 실행).
  • 그 파일 각각에 대해, 쉘은 ( sh)이 짧은 실행 스크립트를 : file -b $0 | grep -q text, 대체 $0파일 이름으로.
  • file프로그램은 각각의 파일의 콘텐츠 타입을 결정하고,이 정보를 출력한다. 이 -b옵션을 사용하면 테스트 된 각 파일의 이름이 인쇄되지 않습니다.
  • grep"text"가file 포함 된 행을 검색하여 프로그램에서 나오는 출력을 필터링합니다 . (일반적인 명령 출력 결과를 참조하십시오 .)file
  • 그러나 (quiet) 옵션이 제공 grep되므로 필터링 된 텍스트를 출력하지 않습니다 -q. 무슨, 그냥 그 변경됩니다 않습니다 종료 상태 중 하나에 0( "true"로 표현 - 필터링 된 텍스트가 발견되었다) 또는 1 (- 텍스트 "오류"를 의미하는 "텍스트" 의 출력에 표시되지 않았다 file).
  • 에서 오는 참 / 거짓 종료 상태 grep로 더 전달 shfind전체 "의 최종 결과의 역할을 -exec sh -c 'file $0 | grep -q text' {} \;"테스트.
  • 경우에는 위의 테스트는 반환 사실 , -print(즉, 테스트 파일의 이름이 인쇄되어 있습니다) 명령이 실행됩니다.

0
bandit4@bandit:~$ ls
inhere

bandit4@bandit:~$ file inhere/*


inhere/-file00: data
inhere/-file01: data
inhere/-file02: data
inhere/-file03: data
inhere/-file04: data
inhere/-file05: data
inhere/-file06: data
inhere/-file07: ASCII text
inhere/-file08: data
inhere/-file09: data

bandit4@bandit:~$ pwd 

/home/bandit4

bandit4@bandit:~$ cat /home/bandit4/inhere/-file07

koReBOKuIDDepwhWk7jZC0RTdopnAYKh
bandit4@bandit:~$ 

간단하게 파일 inhere / * 및 cat / home / bandit4 / inhere / -file07을 사용하십시오

0
find  -type f ! -executable -size 1033c

운동에서 파일을 얻을 것이다



0

find 및 grep을 사용하여 위에서 언급 한이 적기 수준의 암호를 찾는 더 긴 방법이 가장 설명적인 명령이라고 생각합니다.

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

그러나 'file'명령을 더 많이 사용한 후에는 전체 디렉토리 파일 유형을 확인하여 사람이 읽을 수있는 파일 (이 레벨에서는 ASCII라고도 함)을 쉽게 찾을 수 있음을 깨달았습니다. inhere 디렉토리는 이름이 '-filexx'인 파일을 보유하거나 다음을 사용하여 전체 inhere 디렉토리를 빠르게 확인합니다.file ./*

내 접근 방식은 다음과 같습니다.

bandit4@bandit:~/inhere$ file ./*
./-file00: data
./-file01: data
./-file02: data
./-file03: data
./-file04: data
./-file05: data
./-file06: data
./-file07: ASCII text
./-file08: data
./-file09: data

bandit4@bandit:~/inhere$ cat ./-file07
koReBOKuIDDepwhWk7jZC0RTdopnAYKh

-2
du --human-readable | find -not -executable -size 1033c

당신의 결과를 얻을 것이다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.