如何在整个目录上运行dos2unix?

Viv*_*aur 286 linux dos2unix

我必须使用转换整个目录dos2unix.我无法弄清楚如何做到这一点.

Cyb*_*m0n 514

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

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

  • 如果文件名中有空格会破坏.`找到.-type f -print0 | xargs -0 dos2unix`可以解决我认为的问题. (88认同)
  • @vguzmanp 是的,`find` 调用不会执行此检查(尽管添加起来很简单),但是现代的 `dos2unix` 正确地跳过了二进制文件。 (4认同)
  • 请注意,转义分号的反斜杠确保 dos2unix 命令由分号分隔,这样它们最终不会混在一起。如果之后想运行另一个命令,则需要另一个分号,因此`\;; 回声你好` (2认同)
  • 警告:如果您在包含“.git”索引的目录中运行此命令,您的 git 索引将被损坏。 (2认同)
  • 为了避免“.git”索引损坏并保留 UTF-8 BOM,我最终做了“find”。-type f -print0 | xargs -0 dos2unix -ic0 | xargs -0 dos2unix -ic0 | xargs -0 dos2unix -ic0 | xargs -0 dos2unix -ic0 xargs -0 dos2unix -b`。该命令仅涉及那些包含 Windows 换行符的文件(感谢“-ic0”过滤选项),所有其他文件都会被跳过。如果您的存储库包含带有 UTF-8 BOM 的文件,“-b”选项也很有用,它会保留 BOM。 (2认同)

nik*_*ikc 64

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

find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix 
Run Code Online (Sandbox Code Playgroud)

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

  • 为每个单独的文件启动一个新的 dos2unix 进程将引入大量不必要的开销。我会将 `n` 提高一两个数量级(取决于我们在这里讨论的文件数量) (3认同)

Mat*_*don 24

因为我碰巧对dos2unix感到很满意,所以我推出了自己的简单实用工具.除了速度和可预测性方面的一些优点外,语法也更简单:

endlines unix *
Run Code Online (Sandbox Code Playgroud)

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

endlines unix -r .
Run Code Online (Sandbox Code Playgroud)

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

  • 1 /主要是有很多不同的`dos2unix`,它们具有不同的功能(例如,有些读取UTF32,而有些则没有; endlines没有)。只有一个“终点”,这些功能是众所周知的。2 /输入自由,并不是所有的dos2unix都是。3 /高效的文件树浏览,旨在快速,实用地处理数以万计的文件。4 /在OSX上是开箱即用的-由于存在Brew软件包,因此它不再那么重要。 (3认同)
  • 它在`dos2unix`上有何改进?真是好奇。 (2认同)

Kyl*_*and 14

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

dos2unix **
Run Code Online (Sandbox Code Playgroud)

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

shopt -s globstar
Run Code Online (Sandbox Code Playgroud)

....但这是一个非常有用的功能,你应该老老实实地把它放在你的.bashrc手中.

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

dos2unix ** **/.*
Run Code Online (Sandbox Code Playgroud)

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


fri*_*mle 12

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

git ls-files | xargs dos2unix
Run Code Online (Sandbox Code Playgroud)

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

git ls-files '*.sln' '*.bat' | xargs unix2dos
Run Code Online (Sandbox Code Playgroud)

如有必要,请使用 .gitattributes


Ben*_*ing 7

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

.bashrc.profile或无论什么

dos2unixd() {
  find $1 -type f -print0 | xargs -0 dos2unix
}
Run Code Online (Sandbox Code Playgroud)

用法

$ dos2unixd ./somepath

这样你仍然拥有原来的命令dos2unix并且很容易记住这个命令dos2unixd


小智 6

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

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

find . -type f -exec dos2unix {} {} \;
Run Code Online (Sandbox Code Playgroud)


Sah*_*and 6

我认为最简单的方法是:

dos2unix $(find . -type f)
Run Code Online (Sandbox Code Playgroud)