假设我在一个名为Folder
的文件夹中。此文件夹有几个文件类型不同的文件,以及几个名为SubFolder1
、SubFolder2
等的子文件夹。每个子文件夹中都有文件和子文件夹。我想在文件夹中的所有文件上运行dos2unix,无论它们是在主文件夹中还是在几个子目录中。绝对是一切。我该怎么做?据我所知,运行
dos2unix*
仅适用于位于主文件夹中的文件。
第一个解决方案(常规(
标准的find
程序正是为这类任务而设计的。大致如下:
find Folder/ -type f -exec dos2unix '{}' '+'
此命令
- 递归地探索CCD_ 5
- 选择类型为
f
的所有文件(常规文件,与目录、符号链接和其他类型的特殊文件相比( - 并使用所有选择的文件名执行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