我正在将大量Mac数据从用户传输到Windows计算机,并尝试删除所有非法的Windows字符。我在另一篇文章中使用了以下内容,但这不处理空格或(在mac数据上。
find . -name "*[<>:\\|?*]*" -exec bash -c 'x="{}"; y=$(sed "s/[<>:\\|?*]\+/- /g" <<< "$x") && mv "$x" "$y" ' \;
所以我在意外的令牌附近得到语法错误`('对于括号
并且对于那些包含空格的文件或目录没有。
答案 0 :(得分:1)
@ meuh的建议答案不适用于OSX,因为它依赖于非POSIX正则表达式。可能它是为GNU sed编写的,它在许多方面与标准不同。
BREs(由sed使用)不接受此表达式中的+
。相反,使用范围后跟范围的零或更多副本(*
)。
这是一个工作脚本:
#!/bin/sh
find . -name "*[<>:\\|?*]*" 2>/dev/null |
sed "p; s/[<>:\\|?*][<>:\\|?*]*/- /g" |
while read x; read y
do
if test "X$x" != "X$y"
then
mv -v "$x" "$y"
fi
done
和输出(以名为".baf fled/f<>foo2."
的文件开头):
./baf fled/f<>oo2. -> ./baf fled/f- oo2.
答案 1 :(得分:0)
尝试这种替代方案,它应该适用于任何字符序列:
find . -name "*[<>:\\|?*]*" |
sed "p; s/[<>:\\|?*]\+/- /g" |
while read x; read y
do mv "$x" "$y"
done