为了将文件写入 USB 卷,我想重命名包含“?”、“"”、“*”或“:”的文件名,以用空格替换这些字符中的任何一个。但我在使用“*”时遇到了问题我的 bash 脚本是
for file in *
do
mv -v "'"$file"'" "'"$(echo "$file" | sed 's/\(.*\)[?"*:]\(.*\)/\1 \2/')"'"
done
“*”不断扩展到当前目录中的文件名。我尝试过使用
set -f
但最初的“in *”不起作用。
答案1
只要确保正确引用文件名就不会出现问题。
for name in ./*; do
newname=${name//[?\"*:]/ }
if [ "$newname" != "$name" ]; then
mv -iv "$name" "$newname"
fi
done
您"'"$file"'"
实际上$file
完全不加引号(用单引号括起来,但这些不引用变量或其值,因为它们本身被引用)。
也可以看看:
关于你的sed
一点。
sed
有一个很多人似乎忽略的简洁的小命令,称为y
:
sed 'y/?"*:/ /'
这会将表达式第一部分中的所有字符更改为第二部分中的相应字符(此处为所有空格)。
tr
也有效:
tr '?"*:' ' '
bash
但在这种情况下,使用内置的参数替换工具来进行所需的更改会更方便。
答案2
你的引用发生了一些奇怪的事情。
首先将更"'"
改为"