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

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

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

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

但这没有用。

答案1

在 zsh 中,这可以通过以下命令轻松完成zmv功能。输入autoload -U zmv您的~/.zshrc,或在 shell 中运行一次,然后:

zmv '* .pdf' '${f// /}'

这会删除文件名中的所有空格。如果您只想删除.pdf扩展名之前的一项:

zmv '* .pdf' '${f# .pdf}.pdf'

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

zmv '(*) .pdf' '$1.pdf'

如果您也想在子目录中执行操作:

zmv '**/* .pdf' '${f# .pdf}.pdf'

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

zmv '(**/)(*) .pdf' '$1$2.pdf'

在 Linux 下,无论有没有 zsh,如果文件名中只有这一处虚假空格:

rename \ .pdf .pdf *\ .pdf

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

rename ' ' '' *\ .pdf

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

rename \ .pdf .pdf **/*\ .pdf

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

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

find . -name '* .pdf' -exec rename ' .pdf' .pdf {} +

在 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

答案2

这将防止意外覆盖(如果这很重要)。

IFS=$'\n'
for i in $(find . -name '* .pdf')
do
  mv -i "$i" "${i% .pdf}.pdf"
done

如果您在交互式 shell 中运行此命令,您可能希望在更改 IFS 后立即退出它。

相关内容