【问题标题】:Find files with illegal windows characters in the name on Linux在 Linux 上查找名称中包含非法 windows 字符的文件
【发布时间】:2020-04-26 23:51:30
【问题描述】:

我的 Linux 机器上有一个项目,其中包含在 Windows (http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx) 中被视为非法/保留字符的文件。该项目在多个文件夹中有超过 10,000 个文件,我将确定这些文件的路径。

我可以为每个非法/保留字符find . -name "*\?*",但是有没有更简单的方法可以找到所有包含< > : " / \ | ? *的文件

一旦确定,我想从每个文件中删除所有此类字符。

【问题讨论】:

    标签: regex linux grep find


    【解决方案1】:

    这个查找单行应该适合你:

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

    【讨论】:

    • anubhava,有什么方法可以将 mv 也应用到文件夹中吗?
    • 我相信上面的命令会对文件和文件夹执行此操作。
    • 太棒了。非常感谢。还有一个问题,如果你不介意的话。是否可以使用此命令链接某些内容,以便它还更新 HTML 文件中对这些文件的引用。换句话说,如果 HTML 文件引用了“/inc/test:512?abc”,并且此命令将名称更改为“/inc/test-512-abc”,那么 HTML 文件中的出现也将更改为新的一?对不起,很长的文字,非常感谢帮助
    • 您可以使用以下命令运行单独的查找:find . -type f -name '*.html' -exec sed -i.bak 's/[&lt;&gt;:\\|?*]\+/-/g' '{}' \;
    • 这一行代码非常适合查找和替换文件和文件夹中的无效字符。我有一堆来自 Mac 的目录和文件,它们以 NTFS 格式备份到外部硬盘驱动器。在您解决之前,它们在 Windows 10 中确实是一个问题,所以谢谢您!我要为 Linux noob 提供的唯一其他提示是使用 (cd "your drive / folder path") 带引号但不带括号。在我使用引号之前,我无法让终端将目录更改为我的外部驱动器路径。
    【解决方案2】:

    fnmatch 模式允许您指定[] 中的字符,如下所示:

    find . -name '*[<>:/\\|?*]*'
    

    【讨论】:

    • 谢谢!我可以链接一个 xargs 命令来重命名这些文件,删除这些字符并用 - (破折号)替换它们吗?
    • 我必须将双引号更改为单引号才能找到反斜杠
    • @wjandrea,感谢您的反馈。我相应地更新了代码。
    • 我不得不添加双引号作为搜索词。所以我用单引号替换了双引号,然后添加了双引号作为搜索词。
    • 双引号是我服务器上最大的问题......像"Resume" 12:00pm.docx这样的第二时间格式
    【解决方案3】:

    以上答案均未找到以空格 (' ') 或句点/点 ('.') 结尾的文件或目录,这些文件或目录在 Win32 API 中也不可见。

    添加到 .e.g @falsetru 的答案,可以做到

    find . -name '*[<>:/\\|?*]*' -o -name '*[ \.]'
    

    【讨论】:

    • 即使它们不可见,我猜它们仍然是 fs 级别的有效字符。这可能是也可能不是问题
    • 它找到了文件,但是如何将它们串在一起以将那些无效字符替换为有效字符?
    • @Coby-Randal。类似“find ... -print0 | xargs -0
    猜你喜欢
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2012-07-04
    • 2014-03-10
    • 2018-12-10
    • 2017-01-02
    • 1970-01-01
    相关资源
    最近更新 更多