Unix 如何递归检查CTRL+;M字符

Unix 如何递归检查CTRL+;M字符,unix,Unix,如何递归检查父目录中的CTRL+M字符并在Unix中删除它 如果您的意思是^M位于文件和/或目录名中,并且希望删除这些文件和目录: 使用find几乎是微不足道的 唯一棘手的一点是如何在命令行中输入CTRL-M字符:首先键入CTRL-V(以转义解释下一次击键的shell表单)和CTRL-M 所以 find-名称“^M*”-打印 [阅读上面关于如何键入^M的内容] 我会列出所有需要的 及 find-深度-名称“*^M*'-exec rm-rf{}” 将全部删除(如果它是一个目录,则以递归方式—如果您

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

如果您的意思是^M位于文件和/或目录名中,并且希望删除这些文件和目录:

使用find几乎是微不足道的

唯一棘手的一点是如何在命令行中输入CTRL-M字符:首先键入CTRL-V(以转义解释下一次击键的shell表单)和CTRL-M

所以

find-名称“^M*”-打印

[阅读上面关于如何键入^M的内容]

我会列出所有需要的 及

find-深度-名称“*^M*'-exec rm-rf{}”

将全部删除(如果它是一个目录,则以递归方式—如果您希望单独处理目录和文件,也可以这样做(使用-type f和/或-type d)

深度使find递归(为子目录执行),然后再为目录本身执行(删除一些错误条件)


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

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

另外,从父目录中删除^M比看起来更复杂,因此我们需要确保首先从树的底部(文件)移动,并且在完成所有子目录之前,不要重命名目录。 另外,如果目录需要重命名,我们只需在处理目录本身时对其进行重命名,而不是在处理其中的文件时进行重命名

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

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

[同样:在编辑器中键入^M作为控制字符,同时从编辑器中转义它的含义(例如,在vi中,这意味着键入CTRL-V CTRL-M)]

为了让它更简单:最好添加一个测试,看看$new是否存在,因为它会像现在这样在没有警告的情况下覆盖那些$new。 [暂时留给读者作为练习]

因此,首先,我们仅将其称为目录,并进行深度优先:

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

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


如果您的意思是^M在文件本身中,并且要删除这些文件:

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

因此,我们要在适当的地方去做

首先创建命令文件。让我们将其放入/tmp/commands中,并为其提供以下内容:

%s/^M//g
wq

再次说明:您需要从正在使用的编辑器中转义^M(vi是CTRL-V,用于从编辑器中转义下一次击键,就像在命令行中一样)

  • 第一行替换所有行上的所有发生(g)(%) 当然,我一无所有
  • 第二行在编辑后写入文件 它
接下来,我们创建一个小脚本来使用ex执行命令。让我们将其放入/tmp/script中,并为其提供以下内容:

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

然后需要使脚本可执行:

chmod+x/tmp/script

现在,您可以通过查找来运行此操作:

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

要小心自动化那些改变现状的东西:很容易让它逃避太多

为什么我们要使用脚本而不是给出find的
cat | ex
构造:将构造转义为让find-see只有一个命令是相当棘手的,而且无论如何都需要调用一个shell,因此在没有所有转义的情况下可能更容易理解(考虑到这个问题,感觉太高级了).

你是指文件/目录名中的回车(
\r
)吗?它们到底在做什么