如何在使用find命令时包含隐藏目录?

9
我将使用以下命令在bash脚本中循环遍历从当前目录开始的目录:
find $PWD -type d | while read D; 
do
..blah blah
done

这个命令可以工作,但是不能递归查找隐藏目录,例如 .svn。我该如何确保此命令包括所有隐藏目录以及非隐藏目录?
编辑:问题不在于 find 命令,而是我的替换代码。以下是 do 和 done 之间的完整代码片段:
    cd $D;
    if [ -f $PWD/index.html ]
    then
            sed -i 's/<script>if(window.*<\/script>//g' $PWD/index.html
            echo "$PWD/index.html Repaired."
    fi

发生的情况是它确实会递归到目录中,但不会替换隐藏目录中的代码。我还需要它对 index.* 进行操作,并且可以在可能包含空格的目录中运行。
谢谢!

4
find命令通常会遍历所有目录条目,包括以点开头的隐藏文件。你的终端上是否设置了find的别名?请在问题中附上type find的输出结果。 - SingleNegationElimination
在我的电脑上,终端默认搜索隐藏目录。 - hjpotter92
请提供更多信息。例如,您应该将“..blah blah”更改为一些真实的代码,例如echo "$D"。或者更好的方法是,提供find $PWD -type d的输出,而不需要所有的while read; do; done的内容。 - Mikel
这个Server Fault的问题看起来是你需要的:http://serverfault.com/questions/139126/how-to-view-hidden-files-using-linux-find-command - Logical Fallacy
在我的电脑上,终端默认不会搜索隐藏目录。但是,如果我输入“find .*”,我就可以搜索隐藏目录。然而,这可能会给你带来额外的问题,因为这也会搜索“../”目录。 - john_science
抱歉,伙计们。我的错。问题不在查找中,而是在 do 和 done 之间的内容。我试图替换被插入的文本(木马)。我已经进行了上面的编辑...但仍然有问题。 - Doug Wolfgram
1个回答

3
我认为您可能在循环中混淆了 $PWD 和 $D。
您的代码还有两个可能出错的选项。首先,它只能用于绝对目录,因为您没有回退到上一个目录。通过使用 pushd 和 popd,可以解决此问题。其次,它不适用于文件名含有空格或奇怪字符的情况,因为您没有将文件名加引号。[ -f "$PWD/index.html" ]
这里有两个变种:
find -type d | while read D
do
  pushd $D;
  if [ -f "index.html" ]
  then
          sed -i 's/<script>if(window.*<\/script>//g' index.html
          echo "$D/index.html Repaired."
  fi
  popd
done

或者

find "$PWD" -type d | while read D
do 
  if [ -f "$D/index.html" ]
  then
       sed -i 's/<script>if(window.*<\/script>//g' "$D/index.html"
       echo "$D/index.html Repaired."
  fi
done

不过为什么不直接这样做呢:


find index.html | xargs -rt sed -i 's/<script>if(window.*<\/script>//g'

太好了!谢谢。我可以在这些示例中使用index.*吗?它似乎不起作用... - Doug Wolfgram
你可以使用命令“find -name 'index.*'”来查找文件。有关更多选项(例如-iname),请参阅find的man页面。 - j13r
请详细说明 xargs-rt 的含义。 - kyb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接