find -execで現在のファイルを{}に置き換える方法は?

find -execで現在のファイルを{}に置き換える方法は?

私が所有していない(つまり、変更する権限がない)すべてのファイルを探したいです。頑張りました

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シェルに組み込まれているテストを引き続き使用したい場合、または使用する必要がある場合は、シェルを作成してテストを実行する必要がありますbashbash

find . -type f -exec bash -c '[[ ! -O "$1" ]]' bash {} \; -print

これにより、bash -c見つかったファイルごとにインラインスクリプトが実行され、最初の引数()に対してテストが実行されます$1。引数はスクリプトのコマンドラインから渡されますfindbash前の文字列はスクリプト内に{}配置され、$0シェルからエラーメッセージを表示するために使用されます)。テストが真の場合(ファイルが所有していない場合)、-print適用され、ファイルのパス名を印刷します。

これをより効率的に実行できます。

find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' bash {} +

これは、見つかったパス名のバッチをbash -cスクリプトに渡すため、より効率的です。

...しかし、使用する方が-user "$USER"良い選択でしょう。

また見なさい:

おすすめ記事