Wszyscy wiedzą :-), że w Windows zwykłe pliki tekstowe kończą się na CR + LF, aw Unix i Linux - tylko na LF. Jak mogę szybko przekonwertować wszystkie pliki kodu źródłowego z jednego formatu na inny iz powrotem?
Wszyscy wiedzą :-), że w Windows zwykłe pliki tekstowe kończą się na CR + LF, aw Unix i Linux - tylko na LF. Jak mogę szybko przekonwertować wszystkie pliki kodu źródłowego z jednego formatu na inny iz powrotem?
To zależy: jeśli pliki są pod kontrolą wersji, może to być dość niepopularna decyzja, która zanieczyszcza historię. Git ma opcję automatycznej konwersji zakończeń linii przy kasie.
Jeśli nie obchodzi Cię to i chcesz szybko przekonwertować, istnieją programy takie jak fromdos
/ todos
i dos2unix
/, unix2dos
które robią to za Ciebie. Można użyć find
: find . -type f -name '*.php' -exec dos2unix '{}' +
.
Istnieje kilka dedykowanych programów, w tym
Po prostu wybierz narzędzie dla odpowiedniego kierunku i podaj nazwy plików do konwersji w wierszu poleceń.
Jeśli nie masz, ale masz Linux lub Cygwin:
sed -i -e 's/\r\+$//' filename # dos|unix -> unix
sed -i -e 's/\r*$/\r/' filename # dos|unix -> dos
Jeśli masz perla:
perl -i -pe 's/\r+$//' filename # dos|unix -> unix
perl -i -pe 's/\r*$/\r/' filename # dos|unix -> dos
Przy użyciu tylko narzędzi POSIX (w tym BusyBox), aby przejść z unixa na dos, musisz przekazać znak CR dosłownie w poleceniu sed.
cr=$(echo | tr '\n' '\r')
sed -e "s/$cr*\$/$cr/" <filename >filename.dos
mv filename.dos filename
W przeciwnym kierunku możesz po prostu usunąć wszystkie CR:
tr -d '\r' <filename >filename.dos
mv filename.dos filename
Za pomocą symboli wieloznacznych można konwertować wiele plików w tym samym katalogu jednocześnie, np
sed -i -e 's/\r\+$//' *.txt
Aby przekonwertować wszystkie pliki w bieżącym katalogu i jego podkatalogach, jeśli twoją powłoką jest zsh, możesz użyć **/
np
sed -i -e 's/\r\+$//' **/*.txt
Możesz użyć **/
w bash ≥4, ale musisz shopt -s globstar
najpierw uruchomić (możesz umieścić tę linię w swoim ~/.bashrc
). Możesz użyć **/
w ksh93, ale najpierw musisz uruchomić set -o globstar
(możesz umieścić tę linię w swoim ~/.kshrc
.
Jeśli możesz korzystać tylko z narzędzi wymagających przekierowania, użyj for
pętli.
for x in *.txt; do
tr -d '\r' <"$x" >"$x.dos"
mv -- "$x.dos" "$x"
done
Jeśli nie masz **/
lub potrzebujesz bardziej złożonego dopasowania, aby wybrać pliki do konwersji, użyj find
polecenia. Oto przykład Linux / Cygwin, który konwertuje wszystkie pliki w bieżącym katalogu i jego podkatalogach rekurencyjnie, z wyjątkiem plików wywoływanych .o
i podkatalogów bin
.
find -name 'bin' -type d -prune -o \
\! -name '*.o' \
-exec sed -i -e 's/\r\+$//' {} +
Oto przykład POSIX. Mówimy, find
aby uruchomić powłokę, która może wykonać niezbędne przekierowanie.
find -name 'bin' -type d -prune -o \
\! -name '*.o' \
-exec sh -c '
tr -d '\r' <"$0" >"$0.dos"
mv -- "$0.dos" "$0"
' {} \;
Możesz uczynić tę find
metodę nieco szybszą, kosztem bardziej złożonego kodu, używając pętli w poleceniu powłoki.
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
' _ {} +
winscp również automatycznie przekonwertuje, jeśli zostanie o to poproszony .
Jeśli wszystkie pliki znajdują się w tym samym katalogu:
DIRECTORY=/your/directory
unix2dos $DIRECTORY/*