
私が所有していない(つまり、変更する権限がない)すべてのファイルを探したいです。頑張りました
find . -exec if [[ ! -O {} ]]; then echo {}; fi ;
-exec
しかし、コマンド全体を次のように引用符で囲むと:
find . -exec 'if [[ ! -O {} ]]; then echo {}; fi' \;
現在のファイルへの参照は{}
引用符で囲まれてファイルに展開されないため、どちらも機能しません。
{}
問題は、現在のファイルを単純なものよりも複雑なもの(一度だけ使用)-exec
に挿入する方法がわからないことです。コマンドでfindオプションを使用して現在のファイルを複数回参照する方法は? (つまり、もっと時間を使う)find . -exec grep smf {} \;
{}
-exec
{}
答え1
find
実行を要求したユーティリティがif
存在しないため(シェル構文のキーワードです)、コードを実行できません。
-O
引数が現在のユーザーが所有しているファイルの場合はtrueをテストします。次のコマンドを使用して、find
同じテストを直接実行できます-user "$USER"
($USER
現在のユーザーとしてサイズ変更していると仮定)。
find . -type f ! -user "$USER"
test -O
外部test
ユーティリティが非標準テストをサポートしている場合は、次を使用することもできます(確認man test
)。
find . -type f ! -exec test -O {} \; -print
-O
シェルに組み込まれているテストを引き続き使用したい場合、または使用する必要がある場合は、シェルを作成してテストを実行する必要がありますbash
。bash
find . -type f -exec bash -c '[[ ! -O "$1" ]]' bash {} \; -print
これにより、bash -c
見つかったファイルごとにインラインスクリプトが実行され、最初の引数()に対してテストが実行されます$1
。引数はスクリプトのコマンドラインから渡されますfind
(bash
前の文字列はスクリプト内に{}
配置され、$0
シェルからエラーメッセージを表示するために使用されます)。テストが真の場合(ファイルが所有していない場合)、-print
適用され、ファイルのパス名を印刷します。
これをより効率的に実行できます。
find . -type f -exec bash -c '
for pathname do
[[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
done' bash {} +
これは、見つかったパス名のバッチをbash -c
スクリプトに渡すため、より効率的です。
...しかし、使用する方が-user "$USER"
良い選択でしょう。
また見なさい: