如何 运行 对目录及其 sun 目录中所有扩展名的所有文件执行 dos2unix?
How to run dos2unix on all files with all extensions in a directory and its sun-directories?
假设我在一个名为 Folder
的文件夹中。这个文件夹有几个不同文件类型的文件,还有几个名为 SubFolder1
、SubFolder2
等的子文件夹。每个子文件夹中都有文件和子文件夹。我想对文件夹中的所有文件执行 运行 dos2unix,无论它们是在主文件夹中还是在几个子目录之一中。绝对是一切。我怎样才能做到这一点?据我所知,运行宁
dos2unix *
仅适用于主文件夹中的文件。
第一个解决方案(一般)
The standard find
program 正是为这类任务而设计的。大致如下:
find Folder/ -type f -exec dos2unix '{}' '+'
这个命令
- 递归探索
Folder/
,
- selects 类型为
f
的所有文件(常规文件,对比目录,符号 links 和其他类型的特殊文件),
- 并使用所有 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}
假设我在一个名为 Folder
的文件夹中。这个文件夹有几个不同文件类型的文件,还有几个名为 SubFolder1
、SubFolder2
等的子文件夹。每个子文件夹中都有文件和子文件夹。我想对文件夹中的所有文件执行 运行 dos2unix,无论它们是在主文件夹中还是在几个子目录之一中。绝对是一切。我怎样才能做到这一点?据我所知,运行宁
dos2unix *
仅适用于主文件夹中的文件。
第一个解决方案(一般)
The standard find
program 正是为这类任务而设计的。大致如下:
find Folder/ -type f -exec dos2unix '{}' '+'
这个命令
- 递归探索
Folder/
, - selects 类型为
f
的所有文件(常规文件,对比目录,符号 links 和其他类型的特殊文件), - 并使用所有 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}