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

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

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

我尝试了这个解决方案,它的作用与我想要的相反: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,等$2set -- "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将扩展其配置中的更改内部字段分隔符

相关内容