【问题标题】:Using find command on Mac, handling spaces and ( in filenames在 Mac 上使用 find 命令,处理文件名中的空格和 (
【发布时间】:2015-09-29 08:37:50
【问题描述】:

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

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

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

对于那些有空格的人来说,没有这样的文件或目录。

【问题讨论】:

  • 您的文件名中可能包含"。尝试在 bash 脚本中添加 set -x;。
  • 我有带空格的文件名和带括号的文件名,这些都是导致问题的原因,我不想删除空格或括号,只是窗口不喜欢的字符

标签: macos bash unix scripting find


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    @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&lt;&gt;foo2."的文件开始):

    ./baf fled/f<>oo2. -> ./baf fled/f-  oo2.
    

    【讨论】:

      猜你喜欢
      • 2011-09-08
      • 2014-09-24
      • 1970-01-01
      • 2018-04-14
      • 2017-07-17
      • 2013-11-23
      • 2013-10-08
      • 2017-05-29
      • 1970-01-01
      相关资源
      最近更新 更多