UNIX コマンド - find

UNIX コマンド - find

私は UNIX コマンドを学ぼうとしており、このゲームで学んでいますが、今は本当に行き詰まっています。SSH 経由でサーバーに接続しており、ディレクトリにはランダムなファイルやフォルダーがいっぱいで、次のレベルのパスワードはファイルの 1 つにあります。このファイルには次の属性があると言われています。

  • 人間が読める
  • 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

- 部分の動作を簡単に説明しますfile

  • -exec述語は、前のすべての条件 (タイプ、サイズ、実行不可) を満たすsh -c 'file -b $0 | grep -q text' FILENAMEそれぞれに対して実行されます。FILENAME
  • これらのファイルごとに、シェル(sh)は次の短い脚本:をファイル名にfile -b $0 | grep -q text置き換えます。$0
  • fileプログラムは各ファイルのコンテンツ タイプを判別し、この情報を出力します。この-bオプションにより、テストされた各ファイルの名前が印刷されなくなります。
  • grepfileプログラムからの出力をフィルタリングし、次の行を含む行を検索します。"文章"(コマンドの典型的な出力がどのようfileになるか、自分で確認してください。)
  • しかし、grepフィルタリングされたテキストは出力されません。-q(静かな)オプションが与えられている。それが行うことは、単に終了ステータス0(「真」を表す - フィルタリングされたテキストが見つかった)または1(「エラー」を意味する - テキストが見つからない)のいずれかになります。"文章"からの出力には表示されませんでしたfile
  • からの true/false 終了ステータスはにgrep渡され、" " テスト全体の最終結果として機能します。shfind-exec sh -c 'file $0 | grep -q text' {} \;
  • 上記のテストが返された場合真実コマンド-printが実行されます (つまり、テストされたファイルの名前が印刷されます)。

答え2

find . -type f -readable -size 1033c ! -executable

ファイル サイズには cの代わりにを使用していることに注意してください。は 512 バイト ブロックを表します。 は実際のバイトを表します。bbc

答え3

私が書いたのは次の通りです:

find -size 1033c ! -executable

ファイルを取得しました。どうやら人間が読める部分はあなたを混乱させるためだったようです。

答え4

ただし、ゲームの場合、正しい構文は次のようになると思います。

file ./* 

各ファイルの構成をリストした結果が返されます。これは、Bandit ゲームで実現しようとしている目的に非常に有効です。このタスクの本当の難点は、各ファイルが - (ハイフン) で始まることです。

関連情報