UNIX コマンド - 検索

UNIX コマンド - 検索

UNIXコマンドを学ぼうとしていて、学ぶためにこのゲームをしていますが、今は本当に詰まっています。サーバーに SSH で接続すると、ディレクトリは任意のファイルとフォルダでいっぱいになり、次のレベルのパスワードはファイルのいずれかにあります。ファイルに次の属性があると聞きました。

  • 人が読める
  • 1033バイト
  • 施行できない

私はそのコマンドを使うべきだと思い、findそれを試しましたが、find ! -executable多くのファイルが返されました。マニュアルやオンラインで人が読むことができる唯一のヒントは、人が読める方法でファイルサイズを印刷することです。それで、私は少し迷子になりましたか?

私も試してみましたfind ~ -size 1033bが、結果は出ませんでした。しかし、試してみると、find ~ -size -1033bディレクトリ内のすべてのファイルが返されました。

ベストアンサー1

人間が読めるファイル名をフィルタリングするには[: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

-partの動作方法は次のとおりですfile

  • これ-exec述語は、前のすべての条件(タイプ、サイズ、実行不可)を満たすすべてのsh -c 'file -b $0 | grep -q text' FILENAME実行を対象としています。FILENAME
  • 各ファイルに対して shell( sh) がこの短時間実行されます。スクリプトfile -b $0 | grep -q text、、$0ファイル名に置き換えられます。
  • これfileプログラムは各ファイルのコンテンツタイプを決定し、その情報を出力します。この-bオプションは、各テストファイルの名前が印刷されるのを防ぎます。
  • grepfile次を含む行を検索してプログラムの出力をフィルタリングします。「テキスト」。 (fileこのコマンドの一般的な出力がどのように表示されるかを直接確認してください。)
  • ただし、grepフィルタ処理されたテキストは出力されません。-q(静かに)選択をしてください。それがすることはそれを変えるだけだ。終了ステータス("true" - フィルタリングされたテキストを意味) または01("false" を意味 - テキスト)「テキスト」file)の出力には表示されません。
  • の true/false 終了状態は に渡され、テストgrep全体の最終結果として使用されます。shfind-exec sh -c 'file $0 | grep -q text' {} \;
  • 上記のテストが返された場合本物-printコマンドが実行されます(つまり、テスト中のファイル名が印刷されます)。

おすすめ記事