执行“grep |时执行空行xargs“in a”find -exec“

Modified on: Sat, 30 Jun 2018 05:34:30 +0800

我试图通过.htaccess(包含deny from all)列出被Apache阻止的Web服务器的所有目录。
我已经设法获取阻止.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.中相同的列表,但使用xargsdirname来获取包含目录:

    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
    
  5. 醇>

    这两个空行显然与忽略的2 .htaccess文件相匹配,因为它们不包含deny from all。我不明白为什么我会在列表3和4中得到这些。但不是2。

作者:CDuv

最佳答案

它失败了,因为当grep不匹配时,你没有向xargs传递任何东西。

例如:

  1. find获取./.htaccess并调用-exec
  2. grep与文件中的任何内容都不匹配,因此不会输出任何内容
  3. xargs启动dirname,不带任何参数,因此dirname认为它只是被滥用并显示其帮助信息。
  4. 醇>

    正确的方法:

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

相关问答

添加新评论