📄 lineends.pl
字号:
#!/usr/local/bin/perl## Heuristically converts line endings to the current OS's preferred format# # All existing line endings must be identical (e.g. lf's only, or even# the accedental cr.cr.lf sequence.) If some lines end lf, and others as# cr.lf, the file is presumed binary. If the cr character appears anywhere# except prefixed to an lf, the file is presumed binary. If there is no # change in the resulting file size, or the file is binary, the conversion # is discarded.# # Todo: Handle NULL stdin characters gracefully.#use IO::File;use File::Find;# The ignore list is '-' seperated, with this leading hyphen and# trailing hyphens in ever concatinated list below.$ignore = "-";# Image formats$ignore .= "gif-jpg-jpeg-png-ico-bmp-";# Archive formats$ignore .= "tar-gz-z-zip-jar-war-";# Many document formats$ignore .= "eps-psd-pdf-ai-";# Some encodings$ignore .= "ucs2-ucs4-";# Some binary objects$ignore .= "class-so-dll-exe-obj-";# Some build env files in NW/Win32$ignore .= "mcp-xdc-ncb-opt-pdb-ilk-sbr-";$preservedate = 1;$forceending = 0;$givenpaths = 0;$notnative = 0;while (defined @ARGV[0]) { if (@ARGV[0] eq '--touch') { $preservedate = 0; } elsif (@ARGV[0] eq '--nocr') { $notnative = -1; } elsif (@ARGV[0] eq '--cr') { $notnative = 1; } elsif (@ARGV[0] eq '--force') { $forceending = 1; } elsif (@ARGV[0] eq '--FORCE') { $forceending = 2; } elsif (@ARGV[0] =~ m/^-/) { die "What is " . @ARGV[0] . " supposed to mean?\n\n" . "Syntax:\t$0 [option()s] [path(s)]\n\n" . <<'OUTCH'Where: paths specifies the top level directory to convert (default of '.') options are; --cr keep/add one ^M --nocr remove ^M's --touch the datestamp (default: keeps date/attribs) --force mismatched corrections (unbalanced ^M's) --FORCE all files regardless of file name!OUTCH } else { find(\&totxt, @ARGV[0]); print "scanned " . @ARGV[0] . "\n"; $givenpaths = 1; } shift @ARGV;}if (!$givenpaths) { find(\&totxt, '.'); print "did .\n";}sub totxt { $oname = $_; $tname = '.#' . $_; if (!-f) { return; } @exts = split /\./; if ($forceending < 2) { while ($#exts && ($ext = pop(@exts))) { if ($ignore =~ m|-$ext-|i) { return; } } } @ostat = stat($oname); $srcfl = new IO::File $oname, "r" or die; $dstfl = new IO::File $tname, "w" or die; binmode $srcfl; if ($notnative) { binmode $dstfl; } undef $t; while (<$srcfl>) { if (s/(\r*)\n$/\n/) { $n = length $1; if (!defined $t) { $t = $n; } if (!$forceending && (($n != $t) || m/\r/)) { print "mismatch in " .$oname. ":" .$n. " expected " .$t. "\n"; undef $t; last; } elsif ($notnative > 0) { s/\n$/\r\n/; } } print $dstfl $_; } if (defined $t && (tell $srcfl == tell $dstfl)) { undef $t; } undef $srcfl; undef $dstfl; if (defined $t) { unlink $oname or die; rename $tname, $oname or die; @anames = ($oname); if ($preservedate) { utime $ostat[9], $ostat[9], @anames; } chmod $ostat[2] & 07777, @anames; chown $ostat[5], $ostat[6], @anames; print "Converted file " . $oname . " to text in " . $File::Find::dir . "\n"; } else { unlink $tname or die; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -