对于目录中的所有文件,我想用空格替换文件名中的下划线。
我尝试了这个解决方案,它与我想要的相反: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确认预览符合您想要执行的操作后,移除开关。)