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

#1 楼

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

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

评论


如果文件名中有空格,则会中断。找 。型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

#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在目录上运行时仅显示“跳过”,而不是常规文件。因此,在..和。上运行是安全的。)此外,将ls与glob结合使用并不是检查glob的好方法扩展;请使用echo代替:echo **将打印dos2unix从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