删除目录中文件名中的空格

moa*_*eep 3 linux rename files

我有一个目录,其中某些文件名被错误命名something .pdf而不是something.pdf. 是否有一个快速的班轮我可以用来删除文件名中的空格。

我试过了 find -name "* .pdf" -type f | rename 's/ //g'

但这不起作用。

Gil*_*il' 6

在 zsh 中,这可以通过该zmv函数轻松完成。放入autoload -U zmv你的~/.zshrc,或者在你的 shell 中运行一次,然后:

zmv '* .pdf' '${f// /}'
Run Code Online (Sandbox Code Playgroud)

这将从文件名中删除所有空格。如果您只想删除.pdf扩展名之前的那个:

zmv '* .pdf' '${f# .pdf}.pdf'
Run Code Online (Sandbox Code Playgroud)

或使用括号分隔可用作反向引用的组:

zmv '(*) .pdf' '$1.pdf'
Run Code Online (Sandbox Code Playgroud)

如果您还想在子目录中操作:

zmv '**/* .pdf' '${f# .pdf}.pdf'
Run Code Online (Sandbox Code Playgroud)

或(请注意,您必须使用(**/),而不是(**)/):

zmv '(**/)(*) .pdf' '$1$2.pdf'
Run Code Online (Sandbox Code Playgroud)

Linux下,无论有没有zsh,如果文件名中只有这一个伪空格:

rename \ .pdf .pdf *\ .pdf
Run Code Online (Sandbox Code Playgroud)

或者,如果原始名称中只有这个空格:

rename ' ' '' *\ .pdf
Run Code Online (Sandbox Code Playgroud)

如果您还想在子目录中操作,在 ksh93 ?o+ 或 bash ?4 中,您可以使用**来匹配子目录中的文件。在 bash 中,您需要先运行shopt -s globstar(将此行放在您的~/.bashrc)和set -o globstarksh93 中。

rename \ .pdf .pdf **/*\ .pdf
Run Code Online (Sandbox Code Playgroud)

请注意 bash 在递归目录时遵循符号链接。

没有 的好处**,您可以使用find递归。

find . -name '* .pdf' -exec rename ' .pdf' .pdf {} +
Run Code Online (Sandbox Code Playgroud)

在 Debian 及其衍生产品(包括 Ubuntu)和大多数附带 的非 Linux 系统下perl,该rename命令是不同的,它将 Perl 表达式作为参数而不是要替换的字符串和替换字符串。rename.ul在上面的命令中使用(在 Debian 和衍生产品下),或者与 Perl 一起使用rename

rename 's/ \.pdf$/.pdf/' -- *\ .pdf    # strip the space before the extension
rename 's/ //g' -- *\ .pdf             # strip all spaces
Run Code Online (Sandbox Code Playgroud)