我有一个目录,其中一些文件名被错误命名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 globstar
ksh93 中。
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 后立即退出它。