2008-09-23 18 views
46

Mam kilka (setek) plików, które powinny mieć końcówki linii Unix. Podejrzewam, że niektóre z nich mają zakończenia linii Windows i chcę programowo ustalić, które z nich działają.Jak określić koniec wiersza pliku

Wiem, że mogę po prostu uruchomić

flip -u
lub coś podobnego w skrypcie, aby przekonwertować wszystko, ale chcę być w stanie zidentyfikować te pliki, które najpierw trzeba zmienić.

Odpowiedz

28

Można użyć grep

egrep -l $'\r'\$ * 
+0

Uwaga: powyższe polecenie wymaga uruchomienia z bash. – tzot

+3

z jakiegoś powodu, po uruchomieniu tego polecenia w powłoce MacOS X, otrzymuję listę wszystkich plików w katalogu. Nawet ten, który nowo wygenerowałem z testem "echo" "> torderform6.cpp". Masz pojęcie, co może być nie tak? –

+7

Po prostu wyświetla wszystkie pliki w folderze dla mnie na Ubuntu. – rjmunro

0

Windows używa char 13 & 10 dla zakończenia linii, unix tylko jeden z nich (nie pamiętam, który z nich). Więc możesz zastąpić char 13 & 10 dla znaków 13 lub 10 (ten, który używa unixa).

64

Możesz użyć narzędzia file, które wskaże typ zakończenia linii. Lub możesz po prostu użyć dos2unix -U, który zamieni wszystko na końcówki linii Unix, niezależnie od tego, od czego zaczynał.

+4

plik nie wyświetla zakończenia linii. Dawny. : "file .bashrc => .bashrc: ASCII Tekst w języku angielskim" Potrzebujesz dodatkowych klawiszy? –

+7

@Fedir: Tak, wystarczy, że jeśli plik ma zwykłe zakończenia linii LF, to nie wydrukuje żadnych danych wyjściowych.Ale jeśli plik zawiera CRLF, bare CR lub mixed line endings, powie ci to. –

+2

Nie działa dla mnie w skryptach Perl tylko na CRLF na OS X. Może to być rozszerzenie GNU? –

3

Unix używa jednego bajtu, 0x0A (LineFeed), podczas gdy Windows używa dwóch bajtów, 0x0D 0x0A (Powrót karetki, Line feed).

Jeśli nigdy nie widzisz 0x0D, to jest bardzo prawdopodobne, że Unix. Jeśli widzisz pary 0x0D 0x0A, to jest bardzo prawdopodobne, że MSDOS.

14

coś wzdłuż linii:

perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME 

choć trochę tej regexp może potrzebować rafinacji i sprzątania.

To wypisze plik z WIN, MAC lub UNIX na końcu każdego wiersza. Dobrze, jeśli plik jest w jakiś sposób straszny (lub diff) i ma mieszane zakończenia.

+0

Pracowałem dla mnie na Ubuntu, zaakceptowana odpowiedź wydaje się po prostu wypisywać wszystkie pliki –

+0

Nie działa dla mnie, podaje: 'Niedopasowane) w regex; oznaczona przez <- TUTAJ wm/(? <! WIN) <- TUTAJ \ n/at-line 1. ' – moshen

+0

musisz zastąpić < przez '<' – Joseph

0

Kiedy wiesz, które pliki ma zakończenia linii systemu Windows (0x0D 0x0A lub \r \n), co zrobisz z tymi plikami? Założę się, skonwertujesz je na końcówki linii Unix (0x0A lub \n). Można przekonwertować plik z zakończeń linii Windows do zakończeń linii Unix z sed narzędzia, wystarczy użyć polecenia:

$> sed -i 's/\r//' my_file_with_win_line_endings.txt 

można umieścić go w skrypcie tak:

#!/bin/bash 

function travers() 
{ 
    for file in $(ls); do 
     if [ -f "${file}" ]; then 
      sed -i 's/\r//' "${file}" 
     elif [ -d "${file}" ]; then 
      cd "${file}" 
      travers 
      cd .. 
     fi 
    done 
} 

travers 

przypadku uruchomienia go z korzenia dir z plikami, na końcu będziesz mieć pewność, że wszystkie pliki są z końcówkami linii Unix.

4

Oto najbardziej bezpieczna odpowiedź. Stimms odpowiedzieć robi konto dla podkatalogów i plików binarnych

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }' 
  • Zastosowanie file aby znaleźć typ pliku. Osoby z CRLF mają znaki powrotu do okna. Wyjście file jest ograniczone przez :, a pierwsze pole jest ścieżką pliku.
+0

Rzeczywiście najbardziej bezpieczny sposób. Aby przekonwertować tylko wszystkie znalezione pliki, po prostu uruchom 'find. -type plik -exec {} \; | grep "CRLF" | awk -F ':' '{print $ 1}' xargs flip -ub' później. – pixelbrackets

+2

Większość failsafe nie jest - "file" nie zawsze mówi "CRLF" w swoim wyjściu, które zależy od tego, jaki to jest plik. Odkryłem, że dla plików SVG - zawierających tekst bardzo podobny do plików tekstowych - "plik" nie wspomina o rodzaju zakończenia linii. Skrypt ten nie jest więc agnostykiem typu pliku. Tylko mówię. W przeciwnym razie wygląda na zdroworozsądkową, a wspomniane ograniczenie nie stanowi żadnego problemu. – amn

Powiązane problemy