shファイルの-nameオプションと一緒にコマンドfindが機能しません。

shファイルの-nameオプションと一緒にコマンドfindが機能しません。

次のコマンドを使用して、名前に含まれるファイルの数、またはリモートsvサーバーjson上の特定のディレクトリにあるファイルの数を取得します。

nbs_files=`ssh -q -i ${sshkey} ${user}@${server} "find ${path}/ -maxdepth 1 -mindepth 1 -type f -name '*sv*' -o -name '*.json' -exec basename {} \; | wc -l"` 

このコマンドはファイル数のみを返し.jsonsvその名前に含まれるファイルは${path}.

その部分を削除すると、-o -name '*.json'コマンドが正しく実行され、名前に "sv"を含むファイルの数が返されます。

sv名前に含まれるファイルと拡張子を持つファイルを検索するようにコマンドを変更する方法を知っている人はいますか.json

ベストアンサー1

問題は、find式内のand / or演算子の優先順位です。特に、隣接するテスト間の暗黙的なANDは、-o2つの名前付きテスト間のOR()よりも優先されます。したがって、テスト式は次のように解析されます。

    -maxdepth 1 -mindepth 1 -type f -name '*sv*'
OR
    -name '*.json' -exec basename {} \;

...そしてこれはユニーク-name '*.json'で同じブランチの一部なので、jsonファイルに対してのみ実行されます-exec-exec

解決策は、テストの周りに明示的な角かっこを使用して一般的な優先順位を上書きすることです-name

nbs_files=$(ssh -q -i ${sshkey} ${user}@${server} "find ${path}/ -maxdepth 1 -mindepth 1 -type f '(' -name '*sv*' -o -name '*.json' ')' -exec basename {} \; | wc -l")

さて、私もバックティックを次のように自由に交換しました。$( )。これはより現代的なオプションであり、読みやすく、バックティックの奇妙なエスケープ例外はありません。バラよりこの問題そしてバッシュFAQ #82

おすすめ記事