find
オプションと一緒にプログラムを使用するとき、人々はディレクトリに変更し、ファイル名に変更するように-execdir
言うのを見ましたが、マニュアルには何をしているのかわかりません。これを説明する公式文書はありますか?また、相対パスまたは絶対パスに拡張されるかどうかを知りたいです。引数を使用して、その内容を別々のファイルに保存するスクリプトを作成しようとしています。私は2つの別々のパラメータに渡され、各パラメータがどのように拡張されたかを確認できると仮定しましたが、結果を見ると、1つのパラメータだけがスクリプトに渡されたように見えるため、まだ実証できません。これが何であるか、どのように拡張されるかを直接確認してください。{}
+
{}
+
これは私が実行しているコマンドです。find '/home/jesse/hacking/sh_sandbox' -type f -execdir /home/jesse/hacking/sh_sandbox/save_params.sh {} +
save_params.shスクリプトは、次のコードを含む実行可能なシェルスクリプトです。
echo $0 >> /home/jesse/hacking/sh_sandbox/zero_param.txt
echo $1 >> /home/jesse/hacking/sh_sandbox/first_param.txt
echo $2 >> /home/jesse/hacking/sh_sandbox/second_param.txt
echo $3 >> /home/jesse/hacking/sh_sandbox/third_param.txt
Zero_paramテキストファイルは、予想される実行中のスクリプトの名前で埋められます。 first_param.txt ファイルは./filename
別のファイル名で埋められます。 Second_param および Third_param テキストファイルは、どちらも他のファイルと同じ行数の空白行で埋められます。これは2番目のパラメータがに渡されないと信じていましたsave_params.sh
。
答え1
+
は閉じるタグで、{}
ファイル名に置き換えられ、現在のディレクトリはパスです。
だから
$PWD
=/home/jesse/hacking/sh_sandbox/
$0
=/home/jesse/hacking/sh_sandbox/save_params.sh
$1
=./zero_param.txt
$2
=./first_param.txt
$3
=./second_param.txt
$4
=./third_param.txt
それともそうです...質問をもう一度読むと、findが検索するディレクトリを変更するためにスクリプトが書かれているように見えます。
最初の実行時に1つのファイルしか見つかりません
$PWD
=/home/jesse/hacking/sh_sandbox/
$0
=/home/jesse/hacking/sh_sandbox/save_params.sh
$1
=./save_params.sh
したがって、これを反映した内容でファイルが生成されます。
答え2
find ... -execdir command {} +
そのようなことはしないでください。
まず、ディレクトリを一致するファイルがある場所に変更することをfind ... -exec
除いて、コマンドを実行する前と同じように機能します。find
(man find
またはGNU findを使用している場合は、より詳細な文書を入手してくださいinfo find
)。pinfo find
-execdir
GNUのfind
マニュアルページから:
-execdir command ;
-execdir command {} +
に似ています
-exec
が、指定されたコマンドは通常、検索を開始したディレクトリではなく、一致するファイルを含むサブディレクトリで実行されます。これは、一致するファイルへのパスを解析する際に競合状態を回避するため、コマンドを呼び出すより安全な方法です。
-exec
アクションと同様に、フォームは複数の一致するファイルを処理するコマンドラインを作成+
し-execdir
ますが、指定されたコマンド呼び出しは同じサブディレクトリに存在するファイルのみを一覧表示します。このオプションを使用する場合は、
$PATH
環境変数が参照されないようにする必要があります.
。それ以外の場合は、攻撃者が実行するディレクトリに適切な名前のファイルを残して、必要なコマンドを実行できます-execdir
。
$PATH
項目が空である場合、または絶対ディレクトリ名でない場合も同様です。 findにエラーが発生するとすぐに終了することがあるため、保留中の一部のコマンドがまったく実行されないことがあります。ジョブの結果は、ジョブが使用されているかバリアントが使用されているかによって異なります
+
。 true は常に返されますが、コマンドが 0 を返す場合にのみ true です。;
-execdir command {} +
-execdir command {} ;
マンページの抜粋には言及されていませんが、シェルのコマンドラインやスクリプトで実行されているようにエスケープする必要があります;
。 Finishコマンドを示します。脱出する必要はありません。\;
find
find
find
-exec
+