我需要使用dos2unix
将整个目录转换格式。但是我无法弄清楚如何操作。
find . -type f -print0 | xargs -0 dos2unix
这行命令将递归查找当前目录下的所有文件,并为这些文件调用dos2unix命令。
\;; echo Hello
。 - Joshfind
命令并不会进行这项检查(虽然添加此功能很简单),但现代的 dos2unix
命令会正确跳过二进制文件。 - Kyle Strand.git
索引的目录中运行这个命令,你的 git 索引将被损坏。 - mbomb007.git
索引损坏并保留 UTF-8 BOM,我最终使用了 find . -type f -print0 | xargs -0 dos2unix -ic0 | xargs -0 dos2unix -b
命令。该命令仅对包含 Windows 换行符的文件进行操作(得益于 -ic0
过滤选项),忽略所有其他文件。如果您的存储库包含带有 UTF-8 BOM 的文件,则 -b
选项也很有用,它可以保留 BOM。 - Konardfind . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix
这将逐个处理1个文件,并使用4个处理器。
因为我对dos2unix不太满意,所以我自己开发了一个简单的实用程序。除了速度和可预测性方面有一些优势之外,语法也更加简单:
endlines unix *
如果您希望其进入子目录(跳过隐藏目录和非文本文件):
endlines unix -r .
endlines
可在此处获取:https://github.com/mdolidon/endlines
dos2unix
,具有不同的功能(例如一些可以读取UTF32,而另一些则不能;换行符也不同)。只有一个 endlines
,其功能是众所周知的。
2/ 对输入宽容,但并非所有的 dos2unix
都是如此。
3/ 高效的文件树探索,旨在快速实用地处理数以万计的文件。
4/ 可在OSX上直接运行 - 尽管现在有Brew软件包存在这个功能已经不那么重要了。 - Mathias Dolidon一个常见的用例似乎是为所有提交到 Git 存储库的文件 标准化行尾:
git ls-files -z | xargs -0 dos2unix
请注意,某些文件(例如*.sln
,*.bat
)仅适用于Windows操作系统,并应保留CRLF
结尾:
git ls-files -z '*.sln' '*.bat' | xargs -0 unix2dos
如有必要,请使用.gitattributes
xargs
默认将所有空格作为分隔符。xargs
手册显示了一个 --delimiter
选项,但建议在输入可能包含空格时使用 --null
选项。我没有测试过这个选项,但是在你的命令中添加 --null
会产生以下结果:
git ls-files | xargs --null dos2unix
。 - Pulseczar-z
用于ls-files
)。我已经更新了我的答案。再次感谢! - friederbluemle最好跳过隐藏文件和文件夹,例如.git.
,因此,如果您使用的是足够新的bash
版本或者您正在使用zsh
,那么只需执行以下操作:
dos2unix **
请注意,对于Bash来说,这将需要:
shopt -s globstar
......但这个功能非常有用,你应该将其放入你的.bashrc
中。
如果你不想跳过隐藏文件和文件夹,但你仍然不想折腾find
(我也不怪你),你可以提供第二个递归通配符参数来匹配只有隐藏项:
dos2unix ** **/.*
请注意,在这两种情况下,通配符将会扩展以包括目录,因此您可能会看到以下警告(可能会重复多次):Skipping <dir>, not a regular file.
**
而不是 find
的目的是“跳过隐藏文件和文件夹,例如 .git
”。因为 **
不会展开显示隐藏文件,所以 dos2unix
永远不会看到这些隐藏文件。如果你想要自动运行 dos2unix
来处理隐藏文件和文件夹,你可以使用 find
或者 dos2unix ** **/.*
。**/.*
将只展开当前文件夹中的隐藏文件和文件夹,包括 .
(根目录)、..
(父目录)以及任何其他隐藏条目。 - Kyle Strandtype dos2unix
returns dos2unix is hashed (/usr/bin/dos2unix)
- dutoitnsdos2unix
时会打印Skipping <dir>, not a regular file.
,因此在..
和.
上运行是安全的。)此外,将ls
与glob组合使用不是检查glob扩展方式的好方法;改用echo
:echo **
将打印dos2unix **
从dos2unix
接收到的参数。 - Kyle Strand**
的含义完全误解了,使用echo
让它变得清晰明了。 - dutoitns我已经像搜索一百万次了,所以我的解决方案就是将这个bash函数放到您的环境中。
.bashrc
或者 .profile
或任何其他文件
dos2unixd() {
find $1 -type f -print0 | xargs -0 dos2unix
}
用法
$ dos2unixd ./somepath
这样你仍然有原始命令dos2unix
,并且很容易记住这个命令dos2unixd
。
对于任何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