sed没有按预期工作,但仅适用于大于1的目录深度

时间:2012-02-05 02:15:04

标签: linux sed find

我试图在系统上的所有文件中查找字符串的所有实例,直到指定的目录深度。然后,我想用另一个字符串替换它们,我使用'find'和'sed'通过管道输入另一个。

这适用于我使用基本路径为cd /home/../ ..或任何其他不是“/”的目录。它也只有在我选择目录深度为1时才会起作用(所以/test.txt被更改,但/home/test.txt没有更改)如果我没有改变其他任何东西并且使用了深度为2或3,那么/ test .txt和/home/text.txt都已更改。在前者中,没有出现警告,在后者中,出现下面的结果(并且在任一文件中都没有替换任何字符串)。

令人担忧的是,它确实曾经一度发挥作用,但我不知道如何重建结果。我应该说我知道从基本目录使用这些命令的风险,并且以下程序的具体使用是有意的,所以我不是在寻找替代方法,只是一个关于它如何不工作的线索,也许关于如何解决它的建议。

cd /;find . -maxdepth 3 -type f -print0 | xargs -0 sed -i 's/teststring123/itworked/gI'

sed: couldn't open temporary file ./sys/kernel/sedoPGqGB: No such file or directory
sed: couldn't open temporary file ./proc/878/sedtqayiq: No such file or directory

正如你所看到的那样,有警告,但更少的是我期望它起作用,命令看起来很好,我错过了什么人?

1 个答案:

答案 0 :(得分:3)

这应该是:

find / -maxdepth 3 -type f -print -exec sed -i -e 's/teststring123/itworked/g' {} \;

虽然更改/以下的所有文件确实让我觉得非常糟糕(我希望你不是以root身份运行!)。

“无法打开临时文件./ [...]”错误可能是因为sed以您的用户身份运行,无法在/中创建文件

我的版本从您当前的工作目录运行,我假设您的${HOME},您可以在其中创建临时文件,但您仍然无法替换对继续文件至关重要的文件运行您的操作系统。