如何在Unix和Windows换行符格式之间批量转换文件系统分支中的所有文件?


14

大家都知道:-)在Windows纯文本文件中,行以CR + LF终止,而在Unix&Linux中,仅以LF终止。如何快速将所有源代码文件从一种格式转换为另一种格式?

Answers:


17

这取决于:如果文件受版本控制,这可能是一个不受欢迎的历史污染决定。Git可以选择在签出时自动转换行尾。

如果您不在乎并想快速转换,可以使用fromdos/ todosdos2unix/之类的程序unix2dos来完成。您可以使用findfind . -type f -name '*.php' -exec dos2unix '{}' +


7

有几个专用程序,包括

只需选择适当方向的工具,然后在命令行中传递要转换的文件名即可。


如果您都没有,但是有Linux或Cygwin:

sed -i -e 's/\r\+$//' filename             # dos|unix -> unix
sed -i -e 's/\r*$/\r/' filename            # dos|unix -> dos

如果您有perl:

perl -i -pe 's/\r+$//' filename            # dos|unix -> unix
perl -i -pe 's/\r*$/\r/' filename          # dos|unix -> dos

仅使用POSIX工具(包括BusyBox),要从unix转换为dos,您将需要在sed命令中原样传递CR字符。

cr=$(echo | tr '\n' '\r')
sed -e "s/$cr*\$/$cr/" <filename >filename.dos
mv filename.dos filename

另一方面,您可以简单地删除所有CR:

tr -d '\r' <filename >filename.dos
mv filename.dos filename

您可以使用通配符一次转换同一目录中的许多文件,例如

sed -i -e 's/\r\+$//' *.txt

要转换当前目录及其子目录中的所有文件,如果您的外壳为zsh,则可以使用**/,例如

sed -i -e 's/\r\+$//' **/*.txt

您可以**/在≥4的bash 中使用,但您需要先运行shopt -s globstar(可以在中放入此行~/.bashrc)。您可以**/在ksh93 中使用,但需要先运行set -o globstar(可以将此行放入~/.kshrc

如果只能使用需要重定向的工具,请使用for循环。

for x in *.txt; do
  tr -d '\r' <"$x" >"$x.dos"
  mv -- "$x.dos" "$x"
done

如果没有**/或需要更复杂的匹配来选择要转换的文件,请使用find命令。这是一个Linux / Cygwin示例,该示例以递归方式转换当前目录及其子目录下的所有文件,但称为.o和的子目录下的文件除外bin

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sed -i -e 's/\r\+$//' {} +

这是一个POSIX示例。我们告诉find启动一个可以执行必要重定向的外壳程序。

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       tr -d '\r' <"$0" >"$0.dos"
       mv -- "$0.dos" "$0"
' {} \;

find通过在shell命令中使用循环,可以使方法稍快一些,但代价是要编写更复杂的代码。

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       for x; do
         tr -d '\r' <"$x" >"$x.dos"
         mv -- "$x.dos" "$x"
       done
' _ {} +

2

如果被告知winscp也将自动转换。

如果文件全部位于同一目录中:

DIRECTORY=/your/directory
unix2dos $DIRECTORY/*

您能否再多描述一下,如何通过WinSCP实现?
harish sharma

@harishsharma我为“告诉我”添加了一个链接。
尼尔斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.