find test と bash test で同じ結果が得られないのはなぜでしょうか?

find test と bash test で同じ結果が得られないのはなぜでしょうか?

前回の質問でfind -exec で、現在のファイルを {} に置き換えるにはどうすればよいでしょうか?、私は を使用したテストについて質問しましたfind。私が所有していないすべてのファイルを検索したいです。適切な検索コマンドがあります:

find . -type f ! -user "$USER"

しかし、これもまたそうであるべきです:

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

しかし、どちらも異なる結果をもたらします。

1) そうすると[command one] | wc -c--> 4121

ただし: [command two] | wc -c--> 236768 (PS: $HOME 内のファイルを検索しています)。

どちらも、見つかったファイルの数について異なる数値を示します。

2) どちらも結果ファイルで提供されますが、ディレクトリ(はい、ディレクトリは私が所有していないため、権限が拒否されました)。find . -type fオプションの引数にファイル タイプ (ディレクトリではない) があるにもかかわらず、ディレクトリが指定されています。なぜでしょうか? (ls -ldこれらのディレクトリの 1 つを指定すると、リンクやその他のものはありません)

答え1

うーん...、私のホームディレクトリでは、両方のコマンドは同じように動作します。8-/

それでも、stderr を /dev/null にリダイレクトして、wc -l出力を正しくカウントする必要があります。

find . -type f ! -user "$USER" 2>/dev/null | wc -l
find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + | wc -l

ここから結果をテキスト ファイルにリダイレクトし、ファイルを比較して違いを探すことができます。

find . -type f ! -user "$USER" 2>/dev/null > /tmp/file_1.txt
find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + >/tmp/file_2.txt
diff /tmp/file_{1,2}.txt

相違がある場合は、/tmp/file_2.txt の余分なファイルの一部を取得し、ファイルが「ファイルが存在し、有効なユーザー ID によって所有されている場合は True」と見なされない理由をさらに調査します。

答え2

find実際にアクセスできないディレクトリに入るのを避けるには、次を使用できます! -executable -prune

find . ! -executable -prune -type f ! -user "$USER"

否定-executableテストは、アクセス権のないディレクトリに対しては true となり、-pruneこれらのディレクトリを の検索ツリーから削除してfind、ユーティリティがアクセスを試行しないようにし、権限エラーの生成を回避します。

テスト-executable(および類似のテスト-readable-writableテスト) は非標準であり、GNU が必要ですfind

結果の違いについては、あなたが何も言っていないので、(まだ)何も言えません。出力のサイズは大幅に異なるため、あるコマンドが他のコマンドでは見つからなかったものを見つけたケースを見つけて調べるのは簡単なはずです。

関連情報