"find -exec"で "grep | xargs"を実行すると空白行

.htaccessApacheを含むブロックされたdeny from allWebサーバー上のすべてのディレクトリを一覧表示しようとしています。ブロックリストを取得しましたが、次のように.htaccessディレクトリパスを抽出しようとすると、dirnameいくつかのエラーが発生します。

  1. ファイルリスト.htaccess

    find . -type f -name ".htaccess"
    ./.htaccess
    ./config/.htaccess
    ./files/.htaccess
    ./plugins/webservices/.htaccess
    ./plugins/webservices/scripts/.htaccess
    ./install/mysql/.htaccess
    ./scripts/.htaccess
    ./locales/.htaccess
    
  2. ブロックされたファイルのリスト.htaccess

    find . -type f -name ".htaccess" -exec sh -c "grep -Eli '^deny from all$' '{}'" \;
    ./config/.htaccess
    ./files/.htaccess
    ./plugins/webservices/scripts/.htaccess
    ./install/mysql/.htaccess
    ./scripts/.htaccess
    ./locales/.htaccess
    
  3. 間違いは間違いです。 2.と同じリストですが、含まれているディレクトリを取得するには、xargsとを使用します。dirname

    find . -type f -name ".htaccess" -exec sh -c "grep -Eli '^deny from all$' '{}' | xargs dirname" \;
    dirname: missing operand
    Try dirname --help' for more information
    ./config
    ./files
    dirname: missing operand
    Try dirname --help' for more information
    ./plugins/webservices/scripts
    ./install/mysql
    ./scripts
    ./locales
    
  4. リスト3のデバッグを試みる:2つのエラーがある2つの空行を見ることができます。

    find . -type f -name ".htaccess" -exec sh -c "grep -Eli '^deny from all$' '{}' | xargs echo" \;
    
    ./config/.htaccess
    ./files/.htaccess
    
    ./plugins/webservices/scripts/.htaccess
    ./install/mysql/.htaccess
    ./scripts/.htaccess
    ./locales/.htaccess
    

これらの2つの空行は、対応するファイルが.htaccess含まれていないため、無視される2つのファイルとはっきりと一致しますdeny from all。リスト 3 と 4 では、これらの内容が表示されているが、2 では表示されない理由を理解できません。

ベストアンサー1

grepが一致しないときにxargsに何も渡さないので失敗します。

たとえば、

  1. findを受けて./.htaccess電話してください-exec
  2. grepファイルのどの項目とも一致しないため、何も出力されません。
  3. xargsdirnameパラメータなしで起動されたので、悪用されているdirnameと思ってヘルプメッセージを表示しました。

これを行う正しい方法は次のとおりです。

find . -type f -name .htaccess -exec grep -iq '^deny from all$' {} \; -printf '%h\n'

おすすめ記事