如何递归删除文件名中嵌入的回车符

如何递归删除文件名中嵌入的回车符

有没有一种方法可以递归地删除已附加到数十个文件夹层次结构中数千个文件名的回车符 \r 字符?此外,并非所有文件都受到影响。

例如,ls 命令显示 Cymbal2.wav?,其中 ?是一个 \r 字符。

我正在运行 MacOS,所以如果这不是正确的论坛...

答案1

一个变体@吉尔斯的回答删除全部(非隐藏)文件名中的 CR 字符,无论它们位于何处。

autoload -Uz zmv # best in ~/.zshrc
zmv $'(**/)(*\r*)' $'$1${2//\r}'

(来自这些文件所在的顶级目录)。

在这里,我们不想使用,$f因为重要的是我们只更改文件名而不是其他路径名组件,因为这是mv $'a\rb/c\rd' ab/cd行不通的。我们需要先做mv $'a\rb/c\rd' $'a\rb/cd',然后mv $'a\rb' abzmv,因为它处理递归全局变量深度优先(添加(#qoD)限定符)。

$1上面回想一下模式中 s$2捕获的内容,目录名和基本名也是如此。(...)$1$2

答案2

对于批量重命名(或批量复制)文件,zmv是你的朋友。

autoload zmv
zmv -W $'**/*\r' '**/*'

说明:

  • zmv将与给定通配符模式(此处$'**/*\r')匹配的文件重命名为给定的替换表达式(此处**/*)。
  • -W选项允许在替换表达式中使用通配符。
  • $'…'句法支持反斜杠表达式,例如\r回车符。
  • **/*匹配当前目录下任何级别的每个文件(**用于递归通配符

或者:

autoload zmv
zmv $'**/*\r' $'${f%\r}'

$f代表原始文件名和${VARIABLE%SUFFIX} 参数扩展form 去掉给定的后缀。

为您推荐.zshrc

autoload zmv
alias zcp='zmv -C'
alias zln='zln -L'

答案3

正如评论中所解释的,这适用于 Linux,但默认情况下不适用于 MacOS。

touch $'file_\r_name'

ls -l --quoting-style=c file_*
-rw-r--r-- 1 hl hauke 0 23. Nov 17:02 "file_\r_name"

find . -name $'*\r*' -exec rename -nv $'\r' '' {} + 2>/dev/null | cat -v
`./file_^M_name' -> `./file__name'

-nv进入rename详细试运行模式。

cat -v是(或多或少)必要的,因为\r使得输出看起来很奇怪(因为 后面的部分\r覆盖了前面的部分)。

相关内容