Unix 如何递归检查CTRL+;M字符
如何递归检查父目录中的CTRL+M字符并在Unix中删除它 如果您的意思是^M位于文件和/或目录名中,并且希望删除这些文件和目录: 使用find几乎是微不足道的 唯一棘手的一点是如何在命令行中输入CTRL-M字符:首先键入CTRL-V(以转义解释下一次击键的shell表单)和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{}” 将全部删除(如果它是一个目录,则以递归方式—如果您
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
)吗?它们到底在做什么