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

DTh*_*n55 3 shell zsh rename

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

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

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

Sté*_*las 7

@Gilles 答案的一个变体,删除(非隐藏)文件名中的所有CR 字符,无论它们位于何处。

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

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

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

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


Gil*_*il' 6

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

\n
autoload zmv\nzmv -W $\'**/*\\r\' \'**/*\'\n
Run Code Online (Sandbox Code Playgroud)\n

说明:

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

或者:

\n
autoload zmv\nzmv $\'**/*\\r\' $\'${f%\\r}\'\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

为您推荐.zshrc

\n
autoload zmv\nalias zcp=\'zmv -C\'\nalias zln=\'zln -L\'\n
Run Code Online (Sandbox Code Playgroud)\n