用空格替换目录中所有文件的下划线

Ano*_*ity 5 bash rename

对于目录中的所有文件,我想用空格替换文件名中的下划线。

我尝试了这个解决方案,它与我想要的相反:https : //stackoverflow.com/questions/1806868/linux-replacing-spaces-in-the-file-names

但是用下划线切换了空格。这不起作用,给出错误

´x´ is not a directory
Run Code Online (Sandbox Code Playgroud)

例如,其中 x 是文件名中的最后一个单词 hello_world_x

用空格替换目录中所有文件的下划线的正确命令是什么?

小智 12

在您 cd 到正确的目录后,此脚本将可靠地解决您的需求(由于${var//pat/str}扩展而不可移植):

#!/bin/bash

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

*_*glob*_*将选择_名称中包含 的所有文件。

set --这些名称(甚至包括空格或新行)将被可靠地设定为位置参数$1$2等用的简单的命令set -- "list"

for file; 然后,每个位置参数将(依次)分配给 var 文件。

do ... done包含要执行的命令(对于每个$file)。

mv -- "$file" "${file//_/ }"将移动(重命名)每个文件到相同的名称,每个(所有)_ (空格)替换。

注意:您可以添加-i(交互式)选项以避免覆盖现有文件。如果文件存在,mv会询问。需要注意的是:需要一个mv可以与用户通信的交互式 shell 。

mv -i -- "$file" "${file//_/ }"
Run Code Online (Sandbox Code Playgroud)


dha*_*hag 10

从您链接到的答案中抄袭代码并使其更健壮:

for file in *; do mv "$file" "$(echo "$file" | tr '_' ' ')" ; done
Run Code Online (Sandbox Code Playgroud)

引用确保每个文件名mv作为单个标记传递,而不是在空间边界处被打破。

如果您有权访问基于 Perl 的重命名实用程序,以下内容也将起作用:

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

-n确认预览符合您想要执行的操作后,移除开关。)

  • 这将为**所有**文件执行移动(`mv`),无论它们是否有`_`。为 bash 自己可以做的事情调用外部实用程序 (tr) 也不是一个好主意。 (2认同)