web-dev-qa-db-ja.com

UNIXコマンド-検索

私はUNIXコマンドを習得しようとしていて、このゲームをプレイして習得しているのですが、今は本当に行き詰まっています。私はsshを介してサーバーにいて、ディレクトリにはランダムなファイルとフォルダーがいっぱいで、次のレベルのパスワードはファイルの1つにあります。このファイルには次の属性があると聞いています。

  • 人間が読める
  • 1033バイト
  • 非実行可能

私はfindコマンドを使用する必要があると思いますが、find ! -executableを試しましたが、ファイルのロードが返されました。マニュアルまたはオンラインで人間が読める唯一のヘルプは、ファイルサイズを人間が読める形式で出力することです。そこで少し迷っていますか?

また、find ~ -size 1033bを試しましたが、何も返りませんでした。しかし、find ~ -size -1033bを試したところ、ディレクトリ内のすべてのファイルが返されました。

9
Nick Corin

人間が読めるファイル名を除外するには、[:print:]printable文字クラスの名前を利用できます。そのようなクラスの詳細については、grepのマニュアルを参照してください。

find . -type f -size 1033c -name "[[:print:]]*" ! -executable

考え直してみると、「人間が読める」要件は、ファイルの名前ではなく、コンテンツを参照している可能性があります。つまり、textファイルを検索することになります。それはもう少しトリッキーです。 @D_Byeがコメントで提案したように、fileコマンドを使用してファイルのコンテンツタイプを判別する必要があります。ただし、パイプの後にfileを実行することはお勧めしません。ファイル名を表示するタスクが複雑になるためです。これが私が提案するものです:

find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print

これは、file- partがどのように機能するかを簡単に示したものです。

  • -exec述語は、以前のすべての条件を満たす(タイプ、サイズ、実行不可)FILENAMEごとにsh -c 'file -b $0 | grep -q text' FILENAMEを実行します。
  • これらのファイルごとに、シェル(sh)がこの短いscriptfile -b $0 | grep -q textを実行し、$0をファイル名に置き換えます。
  • fileプログラムは、各ファイルのコンテンツタイプを決定し、この情報を出力します。 -bオプションは、テストされた各ファイルの名前を出力しません。
  • grepfileプログラムからの出力をフィルタリングし、 "text"を含む行を検索します。 (fileコマンドの典型的な出力がどのように見えるか、実際に見てください。)
  • ただし、grep-q(quiet)オプションが指定されているため、フィルタリングされたテキストを出力しません。これは、exit status0(「true」を表す-フィルターされたテキストが見つかった)または1(「error」を意味する)に変更するだけです。テキスト "text"fileからの出力に表示されませんでした。
  • grepからの真/偽の終了ステータスは、shによってfindに渡され、「-exec sh -c 'file $0 | grep -q text' {} \;」テスト全体の最終結果として機能します。
  • 上記のテストがtrueを返した場合、-printコマンドが実行されます(つまり、テストされたファイルの名前が出力されます)。
16
rozcietrzewiacz
find . -type f -readable -size 1033c ! -executable

ファイルサイズにcではなくbを使用したことに注意してください。 bは512バイトブロック用です。 cは実際のバイト数です。

8
Tim Pote

私が書いたのは:

find -size 1033c ! -executable

ファイルを取得しました。どうやら人間が読める部分はあなたを捨てることでした。

2
PiousCape262

私はゲームについては正しい構文だと思います:

file ./* 

各ファイルの構成をリストしたリターンが返されます。それはあなたがBanditゲームで達成しようとしていることに対して本当にうまくいきました。このタスクの実際の曲線ボールは、各ファイルが-(ハイフン)で始まることです。

0
ctfred0921
find . -readable -size 1033c \! -executable
0
eb0t

これが3つの条件すべてをカバーする最良の実際の答えだと思います

find inhere/ -type f -size 1033c ! -executable |xargs file | grep text

しかし、多くの人々が言っ​​たように、実行可能で人間が読めるものは私たちを捨てるので、

find inhere/ -type f -size 1033c 

十分です!

0
bleh10