如何在没有dos2unix的情况下,递归地将目录和子目录中所有文件的EOL(dos->unix)转换为Unix格式?是否可以使用“tr -d '\r'”和管道来完成?如果可以,怎么做?
perl -pi -e 's/\r\n/\n/g' *
(从这里偷来的)。
编辑:通过一个小修改,您可以进行子目录递归。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
find . -type f -exec bash -c 'echo -ne "%s/\\\r//\nx\n" | ex "{}" ' \;
您的文件名和目录名是否没有空格等非法字符?
如果是这样,那么这并不难。但如果您需要处理包含换行符和空格等任意字符的名称,则需要比这更加努力。
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'
。 - Dietrich Epp这将从当前目录和所有子目录中删除所有文件的回车符,并且应该在大多数类Unix操作系统上工作:
grep -lIUre '\r' | xargs sed -i 's/\r//'
如果\r
后面没有跟着\n
(在Tim Pote的文件中可能是这种情况):
\r
(使用tr -d
)可能会删除换行符\r
替换为\n
可能不会导致双重/三重换行符也许Tim Pote可以验证他提到的文件上述观点。
$ find | xargs perl -pi -e 's/\r\n/\n/g'
它可以显示一些无法进行原地编辑:
输入一条消息,然后忽略它
find
和xargs
支持它:find -print0 | xargs -0 ...
将处理带有空格的文件名。 - Dennis Williamson.git
子目录。 - prajmus