我必须使用dos2unix
. 我无法弄清楚如何做到这一点。
11 回答
find . -type f -print0 | xargs -0 dos2unix
将递归查找当前目录中的所有文件并调用这些文件 dos2unix 命令
如果它是一个大目录,您可能需要考虑使用多个处理器运行:
find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix
这将一次传递 1 个文件,并使用 4 个处理器。
由于我碰巧对 dos2unix 不太满意,所以我推出了自己的简单实用程序。除了速度和可预测性方面的一些优势外,语法也更简单一些:
endlines unix *
如果你想让它进入子目录(跳过隐藏的目录和非文本文件):
endlines unix -r .
endlines
可在此处获得https://github.com/mdolidon/endlines
最好跳过隐藏文件和文件夹,例如.git.
So 而不是 using find
,如果您的bash
版本足够新或正在使用zsh
,只需执行以下操作:
dos2unix **
请注意,对于 Bash,这将需要:
shopt -s globstar
....但这是一个足够有用的功能,你应该诚实地把它放在你的任何地方.bashrc
。
如果您不想跳过隐藏的文件和文件夹,但您仍然不想弄乱find
(我不会责怪您),您可以提供第二个 recursive-glob 参数以仅匹配隐藏的条目:
dos2unix ** **/.*
请注意,在这两种情况下,glob 都将扩展为包含目录,因此您将看到以下警告(可能多次出现):Skipping <dir>, not a regular file.
一个常见的用例似乎是标准化提交到 Git 存储库的所有文件的行尾:
git ls-files -z | xargs -0 dos2unix
请记住,某些文件(例如*.sln
, *.bat
)仅在 Windows 操作系统上使用并且应保留结尾CRLF
:
git ls-files -z '*.sln' '*.bat' | xargs -0 unix2dos
如有必要,使用.gitattributes
对于任何 Solaris 用户(我正在使用 5.10,也可能适用于较新的版本,以及其他 unix 系统):
dos2unix 不会默认覆盖文件,它只会将更新的版本打印到标准输出,因此您必须指定源和目标,即两次相同的名称:
find . -type f -exec dos2unix {} {} \;
我认为最简单的方法是:
dos2unix $(find . -type f)
我遇到了同样的问题,感谢这里的帖子,我已经解决了。我知道我有大约一百个文件,我只需要为 *.js 文件运行它。
find . -type f -name '*.js' -print0 | xargs -0 dos2unix
感谢大家的帮助。
for FILE in /var/www/html/files/*
do
/usr/bin/dos2unix FILE
done
我已经用谷歌搜索了一百万次,所以我的解决方案是把这个 bash 函数放在你的环境中。
.bashrc
或.profile
或其他
dos2unixd() {
find $1 -type f -print0 | xargs -0 dos2unix
}
用法
$ dos2unixd ./somepath
这样一来,您仍然拥有原始命令dos2unix
,并且很容易记住这个命令dos2unixd
。
如果没有子目录,也可以取
ls | xargs -I {} dos2unix "{}"