395

我必须使用dos2unix. 我无法弄清楚如何做到这一点。

4

11 回答 11

720

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

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

于 2012-08-13T06:56:51.380 回答
86

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

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

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

于 2014-03-20T00:23:38.053 回答
27

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

endlines unix *

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

endlines unix -r .

endlines可在此处获得https://github.com/mdolidon/endlines

于 2014-09-03T10:32:41.467 回答
21

最好跳过隐藏文件和文件夹,例如.git.So 而不是 using find,如果您的bash版本足够新或正在使用zsh,只需执行以下操作:

dos2unix **

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

shopt -s globstar

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

如果您不想跳过隐藏的文件和文件夹,但您仍然不想弄乱find(我不会责怪您),您可以提供第二个 recursive-glob 参数以匹配隐藏的条目:

dos2unix ** **/.*

请注意,在这两种情况下,glob 都将扩展为包含目录,因此您将看到以下警告(可能多次出现):Skipping <dir>, not a regular file.

于 2015-02-28T00:32:28.783 回答
17

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

git ls-files -z | xargs -0 dos2unix

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

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

如有必要,使用.gitattributes

于 2019-02-19T05:49:59.513 回答
7

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

dos2unix 不会默认覆盖文件,它只会将更新的版本打印到标准输出,因此您必须指定源和目标,即两次相同的名称:

find . -type f -exec dos2unix {} {} \;
于 2014-11-01T22:43:12.717 回答
5

我认为最简单的方法是:

dos2unix $(find . -type f)
于 2020-03-02T16:04:48.397 回答
4

我遇到了同样的问题,感谢这里的帖子,我已经解决了。我知道我有大约一百个文件,我只需要为 *.js 文件运行它。 find . -type f -name '*.js' -print0 | xargs -0 dos2unix

感谢大家的帮助。

于 2019-02-19T14:36:05.623 回答
2
for FILE in /var/www/html/files/*
do
 /usr/bin/dos2unix FILE
done
于 2017-10-20T15:37:43.633 回答
2

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

.bashrc.profile或其他

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

用法

$ dos2unixd ./somepath

这样一来,您仍然拥有原始命令dos2unix,并且很容易记住这个命令dos2unixd

于 2020-04-23T03:03:17.807 回答
-1

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

ls | xargs -I {} dos2unix "{}"
于 2012-08-13T06:59:30.760 回答