如何批量重命名文件以删除扩展名前的多余的空格

如何批量重命名文件以删除扩展名前的多余的空格

我有一堆文件的文件名遵循“filename.ext”模式。例如:

filename .ext

我想重命名所有这些以删除 .ext 之前的空格。例如:

filename.ext

我可以使用以下方法找到它们

find * -type f -name'* .*'

但是我该如何重命名所有这些文件呢?

答案1

创建一个名为“renamethis.sh”的文件。其内容应为:

#!/bin/bash
mv "$1" "$(echo $1 | sed 's/ \././')"

设置可执行位:chmod a+x renamethis.sh。然后,运行如下命令:

find /path/to/dir -name '* .*' -type f -print0 | xargs -0L 1 /path/to/renamethis.sh

YMMV,没有明示或暗示的保证等。

值得一提的是,空格是导致这种情况的原因;只要文件名中没有其他奇怪的字符,就可以采用这种方法。如果有,您可能需要考虑使用 Perl 或 PHP 中的 scandir/readdir 循环之类的东西,但上面的脚本是我首先想到的。

答案2

这应该可以帮你解决。

#!/bin/bash

OLDIFS=${IFS}
IFS=$'\n'

for file in `find * -type f -name '* .*'`; do
 _ext=`echo ${file} | cut -d '.' -f 2-`
 _filename=`echo ${file} | cut -d ' ' -f 1`
 mv "${file}" ${_filename}.${_ext}
done

IFS=${OLDIFS}

答案3

我看到您已经解决了当前的问题,但将来您可能需要考虑使用mmv

答案4

一行代码:

find -depth -name '* .*' -print0 |
perl -wn0e '$orig = $_; s/\s+\././g; rename($orig, $_) or warn "$orig: $!\n"'

强调:

  • 在文件名中引用空格没有问题
  • 文件名以破折号开头没有问题
  • 快速:只有两个进程并行启动
  • 正确处理目录

相关内容