【问题标题】:How to run dos2unix on all files with all extensions in a directory and its sun-directories?如何在目录及其 sun 目录中具有所有扩展名的所有文件上运行 dos2unix?
【发布时间】:2021-10-08 02:35:00
【问题描述】:

假设我在一个名为 Folder 的文件夹中。这个文件夹有几个文件类型不同的文件,还有几个名为SubFolder1SubFolder2 等的子文件夹。每个子文件夹中都有文件和子文件夹。我想在文件夹中的所有文件上运行 dos2unix,无论它们是在主文件夹中还是在几个子目录之一中。绝对的一切。我怎样才能做到这一点?据我所知,跑步

dos2unix *

仅适用于位于主文件夹中的文件。

【问题讨论】:

    标签: dos2unix


    【解决方案1】:

    第一个解决方案(一般)

    The standard find program 专为此类任务而设计。大致如下:

    find Folder/ -type f -exec dos2unix '{}' '+'
    

    这个命令

    1. 递归探索Folder/
    2. 选择所有f 类型的文件(常规文件,与目录、符号链接和其他类型的特殊文件相比),
    3. 并使用所有选定的文件名执行dos2unix

    '{}' 是一个占位符,表示您希望在命令中插入文件名的位置,'+' 终止所述命令。您也可以为每个文件名运行dos2unix 一次(通过将'+' 更改为';'),但由于dos2unix 接受任意数量的输入参数,因此最好使用它(如它避免产生许多进程)。

    find 有更多选项,您可以在手册页中找到它们(上面的链接)。

    第二个解决方案(针对您的问题)

    如果您的 shell 是 Bash,则 Bash 支持递归通配符(其他 shell,例如 zsh 可能具有类似的功能)。默认情况下它是禁用的,所以你必须更改一个 shell 选项:

    shopt -s globstar
    

    然后,** 是一个通配符,它​​递归地 选择所有内容(包括目录和其他特殊文件,因此您可能需要对其进行过滤)。之后,您可以尝试:

    dos2unix Folder/**
    

    如果您希望通配符实际选择所有内容,包括以点开头的文件名(隐藏文件),您还需要设置另一个选项:shopt -s dotglob

    【讨论】:

    • 非常感谢!现在还有一个问题:如果我想对所有 .sh 文件(同样在所有文件夹和子文件夹中)运行 dos2unix 怎么办?
    • @tajir12457 在-exec 之前添加-name '*.sh'find 选项。 find 程序可以使用许多不同的标准过滤文件,包括文件名、修改日期等。再次查看所有可用标准的手册页。
    【解决方案2】:

    另一种解决方案是使用 xargs。应注意考虑带有空格的文件名。这是通过 -print0 和 -0 选项完成的。 查找所有需要转换的 *.sh 文件:

    find -name '*.sh' -print0 | xargs -0 dos2unix -ic
    

    运行转换:

    find -name '*.sh' -print0 | xargs -0 dos2unix
    

    【讨论】:

      【解决方案3】:

      Dos2unix 手册 http://dos2unix.sourceforge.net/dos2unix.htm#RECURSIVE-CONVERSION

      递归转换

      在 Unix shell 中,find(1) 和 xargs(1) 命令可用于在目录树中的所有文本文件上递归运行 dos2unix。比如转换当前目录类型下目录树中的所有.txt文件:

      find . -name '*.txt' -print0 |xargs -0 dos2unix
      

      当文件名中包含空格或引号时,需要使用 find(1) 选项 -print0 和相应的 xargs(1) 选项 -0。否则可以省略这些选项。另一种选择是将 find(1) 与 -exec 选项一起使用:

      find . -name '*.txt' -exec dos2unix {} \;
      

      在 Windows 命令提示符中,可以使用以下命令:

      for /R %G in (*.txt) do dos2unix "%G"
      

      PowerShell 用户可以在 Windows PowerShell 中使用以下命令:

      get-childitem -path . -filter '*.txt' -recurse | foreach-object {dos2unix $_.Fullname}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-08
        • 2023-03-28
        • 2012-05-29
        • 1970-01-01
        • 2019-11-03
        • 2011-05-20
        • 1970-01-01
        • 2012-02-24
        相关资源
        最近更新 更多