【发布时间】:2012-05-17 02:50:12
【问题描述】:
如何递归转换目录和子目录中所有文件的所有 EOL (dos->unix)没有 dos2unix? (我没有,无法安装。)
有没有办法使用tr -d '\r' 和管道来做到这一点?如果有,怎么做?
【问题讨论】:
标签: linux bash unix command-line end-of-line
如何递归转换目录和子目录中所有文件的所有 EOL (dos->unix)没有 dos2unix? (我没有,无法安装。)
有没有办法使用tr -d '\r' 和管道来做到这一点?如果有,怎么做?
【问题讨论】:
标签: linux bash unix command-line end-of-line
对于当前目录中的所有文件,您可以使用 Perl 单行:perl -pi -e 's/\r\n/\n/g' *(从 here 窃取)
编辑:稍作修改,您就可以进行子目录递归:
find | xargs perl -pi -e 's/\r\n/\n/g'
【讨论】:
find 和 xargs 支持它:find -print0 | xargs -0 ... 将处理带有空格的文件名。
.git 子目录。
您可以使用 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
陷阱内容可确保您不会留下临时文件。您还可以使用其他技巧,为您的临时文件名提供更多随机名称。除非您在恶劣的环境中工作,否则您通常不需要它们。
【讨论】:
tr 实际上可以识别 \r(BSD 和 GNU 变体),因此您可以使用 tr -d '\r'。
您也可以在批处理模式下使用编辑器。
find . -type f -exec bash -c 'echo -ne "%s/\\\r//\nx\n" | ex "{}" ' \;
【讨论】:
Can't do inplace edit: ./lang is not a regular file, <> line 22167.
如果\r 后面没有\n(可能是Tim Pote 的文件中的情况):
\r(使用tr -d)可能会删除换行符\n 替换\r 可能不会导致双/三换行也许 Tim Pote 可以为他提到的文件验证上述几点。
【讨论】:
这会从当前目录和所有子目录中的所有文件中删除回车,并且应该适用于大多数类 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: 输入消息所以忽略它
【讨论】: