How do I convert all EOL (dos->unix) of all files in a directory and sub-directories recursively without dos2unix
? (I do not have it and cannot install it.)
Is there a way to do it using tr -d '\r'
and pipes? If so, how?
How do I convert all EOL (dos->unix) of all files in a directory and sub-directories recursively without dos2unix
? (I do not have it and cannot install it.)
Is there a way to do it using tr -d '\r'
and pipes? If so, how?
Do you have sane file names and directory names without spaces, etc in them?
If so, it is not too hard. If you've got to deal with arbitrary names containing newlines and spaces, etc, then you have to work harder than this.
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
The trap stuff ensures you don't get temporary files left around. There other tricks you can pull, with more random names for your temporary file names. You don't normally need them unless you work in a hostile environment.
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'
You can also use the editor in batch mode.
find . -type f -exec bash -c 'echo -ne "%s/\\\r//\nx\n" | ex "{}" ' \;
If its done in widows:
try to run the command in git bash:
$ find | xargs perl -pi -e 's/\r\n/\n/g'
It can show some Can't do inplace edit:
type a message so ignore it
You can use sed's
-i
flag to change the files in-place:If I were you, I would keep the files around to make sure the operation went okay. Then you can delete the temporary files when you get done. This can be done like so: