替换目录中所有文件名中的字符

替换目录中所有文件名中的字符

这是作业!

我试图用yay目录中的下划线替换文件名中的所有空格。它要求我使用命令 xargs 和 sh,而不使用 $(command)。我尝试使用命令行为,但它不断显示此消息:

sh: 1: Bad substitution

有人可以解释为什么这个消息不断弹出吗?

以下是我厌倦使用的命令:

find yay -type f -print0 | xargs -0 -I {} sh -c 'newname="${1// /_}"; mv "$1" "$newname"' sh

find yay -type f -exec sh -c 'mv "$1" "${1// /_}"' _ {} \;

答案1

shellsh不理解/替换。 (不过,它确实理解%and 和#。)您需要一个 shell,例如bash

find yay -type f -exec bash -c 'mv -- "$1" "${1// /_}"' _ {} \;

您可以通过减少 shell 的调用次数(当前每个文件一次)来更有效地编写此文件,并且仅在目标尚不存在时才重命名文件:

find yay -type f -name '* *' -exec bash -c 'for f in "$@"; do g=${f// /_}; [ ! -e "$g" ] && mv -f -- "$f" "$g"; done' _ {} +

在测试时,mv加上前缀echo,您将得到一个打印输出(近似值),而无需真正采取任何操作。

相关内容