限制 Bash 文件名扩展

限制 Bash 文件名扩展

为了将文件写入 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

你的引用发生了一些奇怪的事情。

首先将更"'"改为"

相关内容