効率的な方法を見つけようとしています。OverTheWire Bandit Challenge レベル 5。
とにかく複数のファイルがありますが、次の基準を満たすファイルは1つだけです。
- 人が読める
- サイズは1033バイトです。
- 施行不可能
今、私は使用していますfind
注文する。最後の2つの基準に一致するファイルを見つけることができます。
find . -size 1033c ! -executable
しかし、人間が読めないファイルを除外する方法がわかりません。この課題について私が見つけたソリューションは-readable
テストパラメータを使用しますが、これがうまくいくとは思いません。-readable
内容は表示されず、ファイルの権限のみが表示され、チャレンジの説明ではASCIIファイルまたは類似のファイルを要求します。
ベストアンサー1
はい、find
正しいサイズの実行不可能なファイルを見つけて、file
ASCIIをチェックするために使用できます。それは次のとおりです。
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
独立した単語で見つかった行のみが印刷されますgrep
。text
それしなければならない目的とほぼ同じですが、説明に文字列を含めることができる他のファイル形式がないことを保証することはできませんtext
。