我必须使用
dos2unix
转换整个目录。我不知道该怎么做。#1 楼
find . -type f -print0 | xargs -0 dos2unix
将递归地查找当前目录中的所有文件,并调用这些文件dos2unix命令
#2 楼
如果目录很大,则可能要考虑使用多个处理器运行:find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix
这一次将传递1个文件,并使用4个处理器。
评论
这种方法的优点是,即使dos2unix遇到任何问题,它也可以继续!类似于“ --force”方法。谢谢你!
– freeo
2014年10月10日16:29
哇-在尝试转换Windows开发人员添加了错误地添加到git的代码的过程中,节省了我很多时间。谢谢!!
– NetYeti
2015年2月20日,0:26
为每个单独的文件启动新的dos2unix进程将引入大量不必要的开销。我会将n增加一个或两个数量级(取决于我们在此处讨论的文件数量)
– JonoCoetzee
2015年4月23日在12:24
#3 楼
由于恰好对dos2unix不满意,我推出了自己的简单实用程序。除了在速度和可预测性方面的一些优点之外,语法也更简单:非文本文件):
endlines unix *
endlines
可在此处https://github.com/mdolidon/endlines 评论
太棒了!我可以找到的最接近的单线代码是:unix.stackexchange.com/a/365679/112190
– phyatt
17年5月17日在17:33
它在dos2unix上有何改进?真是好奇。
–沃尔夫
17年7月17日在5:26
1 /主要是,有很多不同的dos2unix,具有不同的功能(例如,有些读取UTF32,而有些则没有; endlines没有)。只有一个终点,哪些功能是众所周知的。 2 /输入的自由度,并不是所有的dos2unix都是。 3 /高效的文件树浏览,旨在快速,实用地处理成千上万个文件。 4 /在OSX上是开箱即用的-由于存在Brew软件包,因此它不再那么重要。
–Mathias Dolidon
17年7月17日在11:04
就我而言,这正是我所需要的,非常感谢。受欢迎的功能是处理目录树的简便方法和快速的执行时间。
– AlSavi
3月10日17:10
#4 楼
最好跳过隐藏的文件和文件夹,例如.git.
。因此,如果您的find
版本足够新,或者您使用的是bash
,则不要使用zsh
,只需执行以下操作:dos2unix **
请注意,对于Bash而言,这需要:无论如何,
.bashrc
。如果您不想跳过隐藏的文件和文件夹,但仍然不想弄乱
find
(我也不会怪您),您可以recursive-glob参数仅匹配隐藏的条目:很多次):Skipping <dir>, not a regular file.
评论
这对我不起作用。 globstar语法适用于dos2unix吗?我曾在其他地方成功使用globstar,但无法使其正常工作。我正在使用Bash 4.3.11(1)
– Nico du Toit
16年6月2日在14:25
@NSduToit * NIX样式的shell不允许可执行文件更改参数扩展的行为,因为(与Windows不同,)参数扩展是在可执行文件接收参数之前执行的。因此,我唯一想到的就是您有某种dos2unix别名,该别名会影响参数的扩展方式。系统上dos2unix类型的输出是什么?
–凯尔·斯特兰德(Kyle Strand)
16年6月2日在15:56
@NSduToit这里有些混乱。我的回答明确指出,使用**代替find的目的是“跳过隐藏的文件和文件夹,例如.git”。 dos2unix永远不会看到隐藏的文件,因为**不会展开以显示它们。如果要在隐藏的文件和文件夹上自动运行dos2unix,则可以使用find或dos2unix ** ** /。* ** /。*将仅扩展隐藏的文件和文件夹,包括。 (根目录),..(父目录)以及当前文件夹中的所有其他隐藏条目。
–凯尔·斯特兰德(Kyle Strand)
16年6月2日在17:01
(请注意,dos2unix在目录上运行时仅显示“跳过
–凯尔·斯特兰德(Kyle Strand)
16年2月2日在17:02
谢谢!说得通!好的,对于**的含义,我有一个完全错误的想法,并且使用echo可以使它很清楚。
– Nico du Toit
16年6月2日在17:12
#5 楼
常见的用例似乎是对提交给Git信息库的所有文件的行尾进行标准化:仅在Windows操作系统上使用,并且应保留
*.sln
结尾:git ls-files | xargs dos2unix
如有必要,请使用
*.bat
#6 楼
对于任何Solaris用户(使用5.10的Solaris用户,可能也适用于较新版本以及其他unix系统):标准输出,因此您必须指定源和目标,即两次相同的名称:find . -type f -exec dos2unix {} {} \;
#7 楼
for FILE in /var/www/html/files/*
do
/usr/bin/dos2unix FILE
done
评论
欢迎使用堆栈溢出。尽管您的解决方案是有效的解决方案,但是如果您可以对其添加一些说明,那将是很好的。您可能还考虑参考其他答案以证明您的答案合理。请查看如何回答以获取更多信息。
– kvantour
18年5月14日在16:04
#8 楼
我遇到了同样的问题,感谢这里的帖子,我已经解决了它。我知道我大约有一百个文件,我只需要运行* .js文件即可。find . -type f -name '*.js' -print0 | xargs -0 dos2unix
谢谢大家的帮助。
#9 楼
我认为最简单的方法是:dos2unix $(find . -type f)
#10 楼
我已经在Google上搜索了上百万次,所以我的解决方案是将bash函数放入您的环境中。lang-sh prettyprint-override“>
.bashrc
用法
.profile
这样,您仍然拥有原始命令
dos2unixd() {
find -type f -print0 | xargs -0 dos2unix
}
,它是容易记住这一个$ dos2unixd ./somepath
。#11 楼
如果没有子目录,也可以使用ls | xargs -I {} dos2unix "{}"
评论
如果没有子目录,则dos2unix *会更简单,并且实际上会更强大。 (通常不建议将ls的输出传递给管道,因为它是一种格式化工具,并且*对于编程用途更可靠。)
–凯尔·斯特兰德(Kyle Strand)
2016年12月9日14:55
配管ls不好的原因
–phuclv
18年5月14日在13:55
评论
如果文件名中有空格,则会中断。找 。型f -print0 | xargs -0 dos2unix将解决我认为的问题。
–努法尔·易卜拉欣
2012年8月13日在6:57
我给了这个发现。 -type f -exec dos2unix {} / home / venuk / Desktop / NEO_Src,它给出了错误查找:-exec缺少参数
– Vivek Gaur
2012年8月13日在7:05
请注意,使用分号转义的反斜杠可确保dos2unix命令之间用分号分隔,以免最终将它们混在一起。如果要在以后运行另一个命令,则需要另一个分号,因此\ ;;回声你好
–乔什
2014年5月20日晚上11:43
但是请谨慎使用此命令,它不会检查文件是否需要转换,因此即使二进制文件也将被“转换”,从而损坏它们。
–vguzmanp
2014年12月16日下午16:15
@vguzmanp是的,find调用不执行此检查(尽管添加起来很简单),但是现代的dos2unix正确地跳过了二进制文件。
–凯尔·斯特兰德(Kyle Strand)
16年1月7日在16:58