对于目录中的所有文件,我想用空格替换文件名中的下划线。
我尝试了这个解决方案,它的作用与我想要的相反:https://stackoverflow.com/questions/1806868/linux-replacing-spaces-in-the-file-names
但用下划线交换了空格。这不起作用,给出错误
´x´ is not a directory
例如,其中 x 是文件名中的最后一个单词hello_world_x
将目录中所有文件的下划线替换为空格的正确命令是什么?
答案1
当您 cd 到正确的目录后,此脚本将可靠地解决您的需求(由于扩展而无法移植${var//pat/str}
):
#!/bin/bash
set -- *_*
for file; do
mv -- "$file" "${file//_/ }"
done
*_*
glob将选择名称中 *_*
包含 的所有文件。_
set --
这些名称(甚至包括空格或换行符)将通过简单的命令可靠地设置为位置参数$1
,等$2
set -- "list"
for file;
然后,每个位置参数将(依次)分配给 var 文件。
do ... done
包含要执行的命令(对于每个$file
)。
mv -- "$file" "${file//_/ }"
会将每个文件移动(重命名)为相同的名称,并将每个(全部)_
替换为 (空格)。
笔记:您可以添加-i
(交互式)选项以避免覆盖已经存在的文件。如果文件存在,mv
会询问。需要注意的是:需要有一个mv
可以与用户通信的交互式 shell。
mv -i -- "$file" "${file//_/ }"
答案2
抄袭您链接到的答案中的代码并使其更加健壮:
for file in *; do mv "$file" "$(echo "$file" | tr '_' ' ')" ; done
引用可确保每个文件名作为单个标记传递mv
,而不是在空间边界处被破坏。
如果您有权访问基于 Perl 的重命名实用程序,则以下操作也将起作用:
rename -n 's/_/ /g' *
(-n
确认预览符合您想要执行的操作后,移除开关。)
答案3
find . -depth -name "*_*" -exec \
sh -cf '
for f do IFS=_
IFS=\ set "${f%/*}/"${f##*/}$0
mv "$f" "$*"
done
' _ {} +
POSIXsh
将扩展其配置中的更改内部字段分隔符。