Linux中替换文件名的空格
1. 概述
通常,作为 Linux 用户,当某些文件命令或应用程序由于文件名中的空格而无法运行时,我们会遇到一些麻烦。某些文件操作或实践(例如在文件名中使用空格保存文件)可能是一个可能的原因。在本文中,我们将讨论通过替换文件名中的空格来重命名 此类文件的一些可行方法。
2. 单mv命令
Linux mv 命令并不总是成功地移动或重命名文件或目录。事实上,当用于替换文件名中的空格时,它会返回一个No such file or directory消息。我们将讨论使访问和重命名此类文件成为可能的三个选项。
2.1. 使用反斜杠或制表符补全
我们可以故意放置一个反斜杠,或者在空格前点击制表键来转义这个特殊字符。但是,使用选项卡按钮是首选方法,因为它需要自动完成名称。尽管如此,使用这两种方法中的任何一种,我们都可以访问文件并使用mv 重命名它。以下示例说明了如何:
mv File\ with\ Spaces File_with_Spaces
2.2. 引号中的名称
通过简单地将文件包含在双引号中,我们可以访问文件“带空格的文件”。重命名的mv命令如下所示:
mv "File with Spaces" File_with_Spaces
2.3. 使用find访问文件
ls 和find 之间的显着区别之一是find可以搜索名称中带有空格的文件。在这种情况下,查找命令的搜索模式将是“* *”。然而,具有这种搜索模式的ls命令会失败。
$ ls "* *"
ls: cannot access * *: No such file or directory
使用find命令,将打印带有空格的文件名,并以空字节( -print0 ) 作为分隔符。然后,$0 读取以空字节分隔的文件名,最后,mv用下划线替换空格:
find . -type f -name "* *" -print0 -exec bash -c ‘mv "$0" "${0// /_}"’ {} \;
${0// /_} 部分利用 Bash的参数扩展将一个模式替换为另一个字符串。语法是${parameter/pattern/string}。
3. 重命名文件的其他命令
要替换文件名中的空格,我们还可以使用rename、sed和tr。这次我们将处理一堆文件。使用 for 循环迭代地控制文件集或通过find命令访问文件集。
3.1. 使用rename
用下划线替换空格的简单rename 命令(也采用 Perl 风格的正则表达式)如下所示:
rename ' ' '_' *
它也是我们在前面的案例中看到的 Bash 的参数扩展的替代方案。 rename with find 搜索名称中带有空格的文件,并将所有此类空格替换为下划线:
find * -type f -name "* *" -exec rename "s/\s/_/g" {} \;
使用正则表达式, rename可能不适用于某些系统。有人可能会认为这是一种系统依赖性。事实上,它不是。该命令有两个版本:
- “Perl”版本,语法为 rename ’s/^fgh/jkl/’ fgh*
- util-Linux 版本,语法重命名 fgh jkl fgh*
util-Linux 不支持正则表达式。** rename with regex 适用于“Perl”版本**,如果“无法轻松访问”,则值得安装。
3.2. 使用sed
我们知道, sed 代表流式编辑器。Linux 中sed命令最常见的用途是替换或查找和替换。我们可以使用sed替换文件名中的空格,如下所示:
for i in *' '*; do mv "$i" `echo $i | sed -e 's/ /_/g'`; done
在这里,for将在变量 i 中存储名称中带有空格的文件。然后,sed将用下划线替换文件名中的所有空格。
3.3. 使用tr
tr 命令可以执行基本的字符替换操作:
for f in *; do mv "$f" `echo $f | tr ' ' '_'`; done
在这里, for存储变量 f 中名称中带有空格的文件。然后,tr将标准输入中的所有字符替换为第二组中的第一个字符。