在 Mac 上使用查找命令,处理文件名中的空格和 (

Using find command on Mac, handling spaces and ( in filenames

我正在将大量 Mac 数据从用户传输到 Windows machine 并试图删除所有非法 windows 字符。我使用了另一个 post 的以下内容,但这不处理空格或 ( 在 mac 数据上。

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

所以我在括号的意外标记 `(' 附近出现语法错误

并且对于那些带有空格的文件或目录没有这样的文件或目录。

试试这个应该适用于任何字符序列的替代方法:

find . -name "*[<>:\|?*]*" |
sed "p; s/[<>:\|?*]\+/-  /g" |
while read x; read y
do  mv "$x" "$y"
done

@meuh does not work with OSX because it relies upon a non-POSIX regular expression. Probably it was written for GNU sed 的建议答案,在很多方面都与标准不同。

BREs (used by 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.