如何在整个目录上运行dos2unix?[关闭]


Answers:


591

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

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


94
如果文件名中有空格,则会中断。find . -type f -print0 | xargs -0 dos2unix会解决我认为的问题。
Noufal Ibrahim 2012年

1
我给了这个发现。型f -exec dos2unix {} / home / venuk / Desktop / NEO_Src,它给出了错误查找:`-exec'缺少参数
Vivek Gaur 2012年

1
请注意,使用分号转义的反斜杠可确保dos2unix命令由分号分隔,以免最终将它们混在一起。如果您以后要运行另一个命令,则需要另一个分号,因此\;; echo Hello
Josh 2014年

1
但是请谨慎使用此命令,它不会检查文件是否需要转换,因此即使二进制文件也将被“转换”,从而损坏它们。
vguzmanp 2014年

2
@vguzmanp是的,find调用不会执行此检查(尽管添加起来很简单),但是现代程序会dos2unix正确跳过二进制文件。
Kyle Strand

67

如果目录很大,则可能要考虑在多个处理器上运行:

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

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


1
这种方法的优点是,即使dos2unix遇到任何问题,它也可以继续!类似于“ --force”方法。谢谢你!
Freeo 2014年

哇-在尝试转换Windows开发人员添加了错误地添加到git的代码的过程中,为我节省了很多解决问题的时间。谢谢!!
NetYeti 2015年

1
为每个单独的文件启动新的dos2unix进程将引入大量不必要的开销。我会将其n提高一个或两个数量级(取决于我们在此处讨论的文件数量)
JonoCoetzee 2015年

25

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

endlines unix *

如果您希望它进入子目录(跳过隐藏的目录和非文本文件):

endlines unix -r .

endlines可以在这里https://github.com/mdolidon/endlines


1
太棒了!我可以找到的最接近的单线
代码

2
它如何改进dos2unix?真是好奇。
Walf

3
1 /主要是,有许多dos2unix不同的功能,它们具有不同的功能(例如,有些读取UTF32,而有些则没有;结束线则没有)。只有一种endlines功能是众所周知的。2 /输入自由,并非全部dos2unix。3 /高效的文件树浏览,旨在快速,实用地处理数以万计的文件。4 /在OSX上是开箱即用的-由于存在Brew软件包,因此它不再那么重要。
Mathias Dolidon

1
就我而言,这正是我所需要的,非常感谢。受欢迎的功能是处理目录树的简便方法和快速的执行时间。
AlSavi

17

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

dos2unix **

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

shopt -s globstar

....但这是一个足够有用的功能,.bashrc无论如何您都应该诚实地将其放入。

如果你希望跳过隐藏的文件和文件夹,但你还是不想惹find(和我也不会怪你),你可以提供第二递归水珠参数匹配隐藏的条目:

dos2unix ** **/.*

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


1
这对我不起作用。globstar语法可用于dos2unix吗?我曾在其他地方成功使用过globstar,但无法使其正常工作。我正在使用Bash 4.3.11(1)
NS du Toit

@NSduToit * NIX样式的shell不允许可执行文件更改参数扩展的行为,因为(与Windows不同,)参数扩展是在可执行文件接收参数之前执行的。因此,我唯一想到的就是您有某种dos2unix别名会影响参数的扩展方式。type dos2unix您系统上的输出是什么?
凯尔·斯特兰德

1
@NSduToit这里有些混乱。我的回答明确规定,使用的**替代find是“跳过隐藏的文件和文件夹,如.git”。dos2unix永远不会看到隐藏的文件,因为**不会展开以显示它们。如果你自动运行dos2unix的隐藏文件和文件夹,您可以使用finddos2unix ** **/.***/.*将扩大隐藏的文件和文件夹,包括.(根目录),..在当前文件夹(父目录),以及任何其他隐藏的条目。
Kyle Strand

1
(请注意,dos2unixSkipping <dir>, not a regular file.当在目录上运行时才进行打印,因此可以运行..并且.是安全的。)此外,ls与glob 结合使用并不是检查glob如何扩展的好方法。echo改为使用:echo **将打印dos2unix从接收的参数dos2unix **
Kyle Strand'6

1
谢谢!说得通!好的,我对所**隐含的内容有一个完全错误的想法,并且使用echo它可以使之很清楚。
NS du Toit

7

常见的用例似乎是标准化提交给Git信息库的所有文件的行尾

git ls-files | xargs dos2unix

请记住,某些文件(例如*.sln*.bat)等都是使用在Windows操作系统中,应该保持CRLF结尾:

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

如有必要,使用 .gitattributes


6

对于任何Solaris用户(上午使用5.10,也可能适用于较新版本以及其他UNIX系统):

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

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

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

1
欢迎使用堆栈溢出。尽管您的解决方案是有效的解决方案,但是如果您可以对其添加一些说明,那将是很好的。您可能还考虑参考其他答案以证明您的答案合理。请查看如何回答以获取更多信息。
kvantour

2

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

谢谢大家的帮助。


0

我认为最简单的方法是:

dos2unix $(find . -type f)

0

我已经在Google上搜索了百万次,所以我的解决方案是将bash函数放到您的环境中。

.bashrc.profile或任何

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

用法

$ dos2unixd ./somepath

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.