为啥会找到。 -not -name ".*" 不排除隐藏文件?

Posted

技术标签:

【中文标题】为啥会找到。 -not -name ".*" 不排除隐藏文件?【英文标题】:Why does find . -not -name ".*" not exclude hidden files?为什么会找到。 -not -name ".*" 不排除隐藏文件? 【发布时间】:2013-05-29 20:04:10 【问题描述】:

我想忽略所有隐藏文件,尤其是搜索(以及后来替换)文件时的 .git 和 .svn 文件,我发现在许多在线教程中描述的排除此类隐藏文件的最基本方法并不在这里工作。

find . -not -name ".*"

还将打印隐藏文件。

我要写的脚本是

replace() 
    if [ -n "$3" ]; then expr="-name \"$3\""; fi
    find . -type f \( $expr -not -name ".*" \) -exec echo sed -i \'s/$1/$2/g\'  \;
    unset expr

【问题讨论】:

find . -not -name ".*" 对我有用。 使用find . -not -name '.*',避免shell扩展。 准确地说,它仍然会在隐藏目录中找到(非隐藏)文件。 @Rubens 你在考虑参数扩展; glob 不在双引号内展开。 【参考方案1】:

问题是-not -name ".*" 确实匹配所有以“。”开头的文件和目录。 - 但它不会从搜索中删除它们,因此您将从隐藏目录中获得匹配项。修剪路径使用-prune,即:

find $PWD -name ".*" -prune -o -print

(我使用$PWD,否则搜索“.”的开头也会被剪掉,不会有输出)

【讨论】:

谢谢,但我还是有点迷茫——为什么find $PWD -name '.*' -prune -o -name '*.c' -type f -print 可以工作,而find $PWD -name '.*' -prune -o $expr -type f -printexpr="-name '*.c'" 却不行? expr 的值中嵌入的引号在expr 展开后不会被删除;他们按字面意思对待。 还可以考虑find . -path "*/.*" -prune -o -print,它可以工作并打印相对路径。 注意。使用-prune 时,不应像往常一样在末尾省略-print,因为它会在与-prune 一起使用时改变命令的语义。【参考方案2】:

正确的版本

replace() 
        if [ -n "$3" ]; then expr=-name\ $3; fi
        find $PWD -name '.*' -prune -o $expr -type f -exec sed -i s/$1/$2/g  \;
        unset expr

【讨论】:

以上是关于为啥会找到。 -not -name ".*" 不排除隐藏文件?的主要内容,如果未能解决你的问题,请参考以下文章