人が読めるファイルを探す

人が読めるファイルを探す

効率的な方法を見つけようとしています。OverTheWire Bandit Challenge レベル 5

とにかく複数のファイルがありますが、次の基準を満たすファイルは1つだけです。

  • 人が読める
  • サイズは1033バイトです。
  • 施行不可能

今、私は使用していますfind注文する。最後の2つの基準に一致するファイルを見つけることができます。

find . -size 1033c ! -executable

しかし、人間が読めないファイルを除外する方法がわかりません。この課題について私が見つけたソリューションは-readableテストパラメータを使用しますが、これがうまくいくとは思いません。-readable内容は表示されず、ファイルの権限のみが表示され、チャレンジの説明ではASCIIファイルまたは類似のファイルを要求します。

答え1

はい、find正しいサイズの実行不可能なファイルを見つけて、fileASCIIをチェックするために使用できます。それは次のとおりです。

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

しかし、問題は言葉ほど単純ではありません。 「人が読むことができる」というのは非常にあいまいな用語です。おそらくテキストを意味するようです。わかりました。しかし、どのような文字ですか?ラテン文字ASCIIのみですか?完全なUnicode?たとえば、次の3つのファイルを考えてみましょう。

$ 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独立した単語で見つかった行のみが印刷されますgreptextそれしなければならない目的とほぼ同じですが、説明に文字列を含めることができる他のファイル形式がないことを保証することはできませんtext

答え2

主に検出されたファイルに対して特定のタスクを実行するために使用されますが、-execテストとしても使用できます。したがって、これを他の基準に追加できます。

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

grepパターンが見つからない場合は、ゼロ以外の値が返され、評価結果が返されることに注意してくださいsh -c "COMMAND"(有効な限り)。したがって、これは「エスケープシーケンスを含む非ISO拡張ASCIIテキスト」ではなく、「UTF-8 Unicodeテキスト」または「ASCIIテキスト」file <filename>で終わるファイルのみを印刷します。text

1行では、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 {} +

関連情報