如何在一个目录及其sun目录中的所有扩展名的文件上运行dos2unix



假设我在一个名为Folder的文件夹中。此文件夹有几个文件类型不同的文件,以及几个名为SubFolder1SubFolder2等的子文件夹。每个子文件夹中都有文件和子文件夹。我想在文件夹中的所有文件上运行dos2unix,无论它们是在主文件夹中还是在几个子目录中。绝对是一切。我该怎么做?据我所知,运行

dos2unix*

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

第一个解决方案(常规(

标准的find程序正是为这类任务而设计的。大致如下:

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

此命令

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

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

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

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

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

shopt -s globstar

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

dos2unix Folder/**

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

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

递归转换

在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}

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

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

运行转换:

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

相关内容

  • 没有找到相关文章

最新更新