如何在整个目录上运行dos2unix ?

我必须使用dos2unix转换整个目录。我不知道该怎么做这件事。

283133 次浏览

find . -type f -print0 | xargs -0 dos2unix

将递归找到当前目录内的所有文件,并调用这些文件dos2unix命令

如果没有子目录,也可以取

ls | xargs -I {} dos2unix "{}"

如果它是一个大目录,你可能需要考虑运行多个处理器:

find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix

这将一次传递一个文件,并使用4个处理器。

由于我对dos2unix不太满意,所以我推出了自己的简单实用程序。除了在速度和可预测性方面的一些优势外,语法也更简单:

endlines unix *

如果你想让它进入子目录(跳过隐藏的dirs和非文本文件):

endlines unix -r .

endlines在这里可用

对于任何Solaris用户(我使用5.10,可能也适用于更新版本,以及其他unix系统):

Dos2unix不会默认覆盖文件,它只会将更新后的版本打印到stdout,所以你必须指定源和目标,即相同的名称两次:

find . -type f -exec dos2unix {} {} \;

最好跳过隐藏的文件和文件夹,例如.git.。因此,不要使用find,如果你的bash版本是最近的,或者如果你正在使用zsh,只需执行:

dos2unix **

注意,对于Bash,这将需要:

shopt -s globstar

....但这是一个足够有用的功能,你应该诚实地把它放在你的.bashrc中。

如果你想要跳过隐藏的文件和文件夹,但你仍然不想打乱find(我不会责怪你),你可以提供第二个递归glob参数来匹配只有隐藏的条目:

dos2unix ** **/.*

请注意,在这两种情况下,glob都将扩展到包含目录,因此您将看到以下警告(可能多次)

for FILE in /var/www/html/files/*
do
/usr/bin/dos2unix FILE
done

一个常见的用例似乎是标准化提交到Git存储库的所有文件的行结束符:

git ls-files -z | xargs -0 dos2unix

请记住,某些文件(例如*.sln*.bat)在Windows操作系统上使用只有,并且应该保持 CRLF结尾:

git ls-files -z '*.sln' '*.bat' | xargs -0 unix2dos

如有必要,使用.gitattributes

我也有同样的问题,多亏了这里的帖子,我已经解决了它。我知道我有大约100个文件,我只需要为*.js文件运行它。 find . -type f -name '*.js' -print0 | xargs -0 dos2unix < / p >

谢谢大家的帮助。

我认为最简单的方法是:

dos2unix $(find . -type f)

我已经在谷歌上搜索过上百万次了,所以我的解决方案是把这个bash函数放到你的环境中。

.bashrc.profile之类的

dos2unixd() {
find $1 -type f -print0 | xargs -0 dos2unix
}

使用

$ dos2unixd ./somepath

这样你仍然有原来的命令dos2unix,并且很容易记住这个命令dos2unixd