0

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

dos2unix *

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

4

3 回答 3

2

第一个解决方案(一般)

标准find程序专为此类任务而设计。类似于以下内容:

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.

于 2021-04-25T14:52:56.570 回答
0

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}
于 2021-10-07T18:35:00.997 回答
0

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

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

运行转换:

find -name '*.sh' -print0 | xargs -0 dos2unix
于 2021-08-23T19:08:04.960 回答