如何递归检查CTRL + M字符

时间:2015-10-12 10:00:56

标签: unix

如何递归检查父目录中的CTRL + M字符并在Unix中将其删除?

1 个答案:

答案 0 :(得分:1)

如果您的意思是^ M在文件和/或目录名称中,并且您想要删除这些文件和目录:

使用find,这几乎是微不足道的。

唯一棘手的问题是如何在命令行输入CTRL-M字符:首先输入CTRL-V(以逃避解释下一次击键的shell形式)和CTRL-M

所以

find .. -name '*^M*' -print

[阅读上面有关如何输入^ M的信息]

将列出所需的全部内容 和

find .. -depth -name `*^M*' -exec rm -rf {} \;

会将它们全部删除(如果它是一个目录,则递归删除它们 - 如果你想要单独处理目录和文件,那也是可能的(使用-type f和/或-type d)

-depth使查找递归(为孩子们做)在为教区本身执行之前(删除一些错误条件)

如果您的意思是^ M在文件名中,并且您想要重命名这些文件:

上面的基本find构造保持不变,但是我们需要调用重命名目录或文件而不是删除它的东西。

同样从父目录中删除^ M比看起来更复杂,所以我们需要确保首先从树的底部(文件)移动而不是重命名目录,直到我们完成和所有的孩子一起 此外,如果目录需要重命名,我们需要在我们处理目录本身时重命名它,并且在处理其中的文件时尚未执行此操作。

因此,让我们制作一个小脚本并将其命名为/ tmp / rename 它将文件名作为参数并重命名该文件(或目录)。

#/bin/sh OLD=$1 PTH=`echo $OLD | sed 's/^\(.*\)\/[^\/]*$/\1/'` FLE=`echo $OLD | sed 's/^.*\/\([^\/]*\)$/\1/'` NEW=`echo $FLE | sed 's/^M//g'` echo mv $OLD $PTH/$NEW

[再次:^ M应该在编辑器中输入作为控制字符,同时从编辑器中删除它的含义(例如在vi中表示将其键入为CTRL-V CTRL-M)]

为了让它变得更加万无一失:最好添加一个测试来查看$ new是否存在,因为它会覆盖那些没有警告的现在。 [暂时留给读者练习]

所以首先我们只将它称为目录,然后我们首先进行深度处理:

find .. -depth -exec /tmp/rename {} \;

应首先重命名所有文件和目录,深度(对于更复杂的情况,这一点非常重要)。

如果你的意思是^ M在文件中,你想删除它们:

sed可以使用以下命令轻松删除^ M个字符:sed 's/^M//g'。但是要在原地和文件树中执行此操作,如果要使用sed,则需要创建临时文件(和/或备份文件)。

所以在ex上就地进行。

首先创建命令文件。让我们把它放在 / tmp / commands 中,并给它以下内容:

%s/^M//g wq

再说一遍:你需要从你正在使用的编辑器中逃脱^ M(它是vi的CTRL-V以逃避编辑器的下一次击键 - 就像在命令行 - )

  • 第一行代替所有行的所有出现(g)(%) ^ M没有任何东西
  • 第二行在编辑后写入文件 它。

接下来,我们创建一个小脚本来使用ex执行命令。让我们把它放在 / tmp / script 中,并给它以下内容:

#!/bin/sh cat /tmp/commands | ex -s $1

然后需要使脚本可执行:

chmod +x /tmp/script

现在通过find:

运行

find .. -type f -exec /tmp/script {} \;

小心自动化可以在适当位置改变内容的东西:它很容易让它逃脱得太远。

为什么我们使用脚本而不是找到cat | ex构造:转义构造以查找只看到一个命令是相当棘手的,并且涉及到调用shell,所以不妨让它更容易在没有所有逃避的情况下理解(并且考虑到这个问题,感觉太过先进)。