如何在没有的情况下递归地转换目录和子目录中所有文件的所有 EOL (dos->unix ) dos2unix
?(我没有,无法安装。)
有没有办法使用tr -d '\r'
和管道来做到这一点?如果是这样,怎么做?
如何在没有的情况下递归地转换目录和子目录中所有文件的所有 EOL (dos->unix ) dos2unix
?(我没有,无法安装。)
有没有办法使用tr -d '\r'
和管道来做到这一点?如果是这样,怎么做?
For all files in current directory you can do it with a Perl one-liner: perl -pi -e 's/\r\n/\n/g' *
(stolen from here)
EDIT: And with a small modification you can do subdirectory recursion:
find | xargs perl -pi -e 's/\r\n/\n/g'
您可以使用 sed 的-i
标志来就地更改文件:
find . -type f -exec sed -i 's/\x0d//g' {} \+
如果我是你,我会保留这些文件以确保操作顺利进行。然后,您可以在完成后删除临时文件。这可以这样做:
find . -type f -exec sed -i'.OLD' 's/\x0d//g' {} \+
find . -type f -name '*.OLD' -delete
你有没有空格等的健全的文件名和目录名吗?
如果是这样,那就不太难了。如果您必须处理包含换行符和空格等的任意名称,那么您必须比这更努力。
tmp=${TMPDIR:-/tmp}/crlf.$$
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15
find . -type f -print |
while read name
do
tr -d '\015' < $name > $tmp.1
mv $tmp.1 $name
done
rm -f $tmp.?
trap 0
exit 0
陷阱的东西可确保您不会留下临时文件。您还可以使用其他技巧,为您的临时文件名提供更多随机名称。除非您在恶劣的环境中工作,否则您通常不需要它们。
您还可以在批处理模式下使用编辑器。
find . -type f -exec bash -c 'echo -ne "%s/\\\r//\nx\n" | ex "{}" ' \;
如果\r
后面没有\n
(可能是 Tim Pote 的文件中的情况):
\r
(使用tr -d
)可能会删除换行符\r
为\n
可能不会导致双/三换行符也许蒂姆波特可以为他提到的文件验证上述几点。
这会从当前目录和所有子目录中的所有文件中删除回车,并且应该适用于大多数类 Unix 操作系统:
grep -lIUre '\r' | xargs sed -i 's/\r//'
如果它在寡妇中完成:
尝试在 git bash 中运行命令:
$ find | xargs perl -pi -e 's/\r\n/\n/g'
它可以显示某种Can't do inplace edit:
类型的消息,因此请忽略它