効率的な方法を見つけようとしています。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
。
答え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 -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 {} +