如何将当前目录的所有文件名中的一个字符替换为另一个字符?

如何将当前目录的所有文件名中的一个字符替换为另一个字符?

如何重命名当前文件夹中的所有文件/子目录?

可以说,我有许多带有空格的文件和子目录,我想用下划线替换所有空格。

File 1
File 2
File 3
Dir 1
Dir 3

应该重命名为

File_1
File_2
File_3
Dir_1
Dir_3

答案1

在任何 shell 中,您都可以循环遍历名称包含空格的文件。在 bash、ksh 和 zsh 中用下划线替换空格很容易${VARIABLE//PATTERN/REPLACEMENT}

for x in *" "*; do
  mv -- "$x" "${x// /_}"
done

在 Debian、Ubuntu 及其衍生产品上,您可以使用 Perl rename(其他发行版提供不同的程序,例如rename,该程序在这里没有帮助)。

rename 's/ /_/g' ./*

一个强制性的 zsh 解决方案:

autoload zmv
zmv '(*)' '${1// /_}'

或者:

autoload zmv
zmv '*' '${f// /_}'

强制性的 POSIX 解决方案:

for x in *" "*; do
  y=$(printf %s/ "$x" | tr " " "_")
  mv -- "$x" "${y%/}"
done

答案2

如果您还需要重命名子目录中的文件,并且您find支持-execdir谓词,那么您可以这样做

find /search/path -depth -name '* *' \
    -execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;

感谢@glenn jackman 提出的-depth选项find并让我思考。

请注意,在某些系统(包括 GNU/Linux 系统)上,find可能无法找到名称中包含空格以及不形成有效字符的字节序列的文件(通常是名称中包含以字符集编码的非 ASCII 字符的媒体文件)与语言环境不同)。将区域设置设置为C(如 中所示LC_ALL=C find...)可以解决该问题。

答案3

您可以rename为此使用(这里假设来自 的一个util-linux,而不是那个perl,也不是删除的):

cd /path/to/dir
rename ' ' _ *\ *

这将找到名称中的所有文件和目录空格,并将空格替换为下划线。由于它使用 glob 文件匹配,因此您需要位于正确的目录中才能开始。

如果您想进行递归匹配,则可以,但您可能必须执行rename几次才能捕获目录中本身已重命名的任何项目:

cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!

答案4

在 Debian/Ubuntu 上,基于 Caleb 和 Gilles 的答案,这就是我递归重命名文件的方法:

cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **

注意:要预览哪些文件将被重命名以及如何重命名,请使用以下-n开关rename

rename -n 's/ /_/g' **

另请注意:设置globstar**匹配所有子目录中的文件,因此如果仅需要当前目录,请不要设置 globstar 或*使用**.

另请注意:rename对于多次出现搜索词的文件,需要多次运行该命令。

相关内容