在Mac上使用find命令,处理空格和(在文件名中)

时间:2015-07-10 14:31:50

标签: macos bash unix scripting find

我正在将大量Mac数据从用户传输到Windows计算机,并尝试删除所有非法的Windows字符。我在另一篇文章中使用了以下内容,但这不处理空格或(在mac数据上。

find . -name "*[<>:\\|?*]*" -exec bash -c 'x="{}"; y=$(sed "s/[<>:\\|?*]\+/-  /g" <<< "$x") && mv "$x" "$y" ' \;

所以我在意外的令牌附近得到语法错误`('对于括号

并且对于那些包含空格的文件或目录没有。

2 个答案:

答案 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