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

Nob*_*bbZ 55 linux bash rename

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

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

File 1
File 2
File 3
Dir 1
Dir 3
Run Code Online (Sandbox Code Playgroud)

应该重命名为

File_1
File_2
File_3
Dir_1
Dir_3
Run Code Online (Sandbox Code Playgroud)

enz*_*tib 47

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

find /search/path -depth -name '* *' \
    -execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 将 `-name '* *'` 更改为 `-name '*_*'` 并将 `"${1// /_}"` 更改为 `"${1//_/.}"` (3认同)

Gil*_*il' 47

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

for x in *" "*; do
  mv -- "$x" "${x// /_}"
done
Run Code Online (Sandbox Code Playgroud)

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

rename 's/ /_/g' *
Run Code Online (Sandbox Code Playgroud)

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

autoload zmv
zmv '(*)' '${1// /_}'
Run Code Online (Sandbox Code Playgroud)

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

for x in *" "*; do
  y=$(printf %sa "$x" | tr " " "_")
  mv -- "$x" "${y%a}"
done
Run Code Online (Sandbox Code Playgroud)


Cal*_*leb 17

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

cd /path/to/dir
rename ' ' _ *\ *
Run Code Online (Sandbox Code Playgroud)

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

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

cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!
Run Code Online (Sandbox Code Playgroud)

  • “`rename` 将通过将名称中的 *from* 的 **first** 替换为 *to* 来重命名指定的文件。” 因此,这仅适用于名称中包含单个空格的文件。(您可以在循环中调用 `rename`,但它在这里并不是真正正确的工具。) (3认同)
  • rename 有一个“-a”参数,告诉它替换所有出现的地方 (3认同)