it-swarm.cn

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

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

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

File 1
File 2
File 3
Dir 1
Dir 3

应该重命名为

File_1
File_2
File_3
Dir_1
Dir_3
43
NobbZ

如果您还需要重命名子目录中的文件,并且find支持-execdir谓词,则可以执行

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

感谢@glenn jackman为find建议-depth选项,并让我思考。

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

37
enzotib

在任何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// /_}'

强制性POSIX解决方案:

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

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

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

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

如果您想进行递归匹配,则可以,但是您可能必须执行rename几次才能捕获目录中自己重命名的所有项目:

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

如果已安装,则另一个选项是mmv

mmv \*\ \* \#1_#2
2
glglgl

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

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

注意:要预览将重命名哪些文件以及如何重命名,请使用-nrename切换:

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

另一个注意事项:设置globstar会使**匹配所有子目录中的文件,因此,如果只需要当前目录,请不要设置globstar或使用* 代替 **

另一个注意事项:对于多次出现搜索词的文件,必须多次运行rename命令。

1
Markus Pscheidt

如果您不是正则表达式的专家(我不是!),并且可以运行为kde设计的应用程序(使用kde-k桌面或安装了库),那么krename是一个很棒的图形实用程序,让您看到before之前和之后的更改。它具有许多作为选项的简单转换,还支持正则表达式。您甚至可以将多个顺序转换合并为一个重命名,因此您不必设计一个即可一次完成所有操作的复杂转换。它也具有在应用重命名后继续重命名相同文件的选项。

我不经常使用它,但是当我这样做时,它确实可以快速轻松地完成工作。重命名各种下载的媒体文件时,它确实非常方便,因此您可以在系统上对其进行统一管理。这有助于单独下载krename手册,以便您在使用程序时可以参考它。

http://www.krename.net/

0
Joe