如何 运行 对目录及其 sun 目录中所有扩展名的所有文件执行 dos2unix?

How to run dos2unix on all files with all extensions in a directory and its sun-directories?

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

dos2unix *

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

第一个解决方案(一般)

The standard find program 正是为这类任务而设计的。大致如下:

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

这个命令

  1. 递归探索Folder/
  2. selects 类型为 f 的所有文件(常规文件,对比目录,符号 links 和其他类型的特殊文件),
  3. 并使用所有 selected 文件名执行 dos2unix

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

find 还有更多选项,您可以在手册页中找到它们(link 以上)。

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

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

shopt -s globstar

那么,**是一个通配符,select递归所有东西(包括目录和其他特殊文件,所以你可能需要过滤它) .之后,你可以试试:

dos2unix Folder/**

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

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

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

运行 转换:

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

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。否则可以省略这些选项。另一种选择是使用带有 -exec 选项的 find(1):

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

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

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

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

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