Następująca sytuacja:
Pracuję na komputerze Mac z systemem OS X i niedawno dołączyłem do projektu, którego członkowie do tej pory używają systemu Windows. Jednym z moich pierwszych zadań było ustawienie bazy kodu w repozytorium Git, więc ściągnąłem drzewo katalogów z FTP i spróbowałem sprawdzić je w repozytorium Git, które przygotowałem lokalnie. Próbując to zrobić, otrzymałem tylko to
fatal: CRLF would be replaced by LF in blog/license.txt.
Ponieważ ma to wpływ na wszystkie pliki poniżej folderu „blog”, szukam sposobu na wygodną konwersję WSZYSTKICH plików w drzewie na końcówki linii Uniksa. Czy istnieje narzędzie, które robi to po wyjęciu z pudełka, czy też sam mogę coś napisać?
Dla porównania moja konfiguracja Gita dotycząca zakończeń linii:
core.safecrlf=true
core.autocrlf=input
źródło
find blog -type f | xargs dos2unix
powinno być szybsze. Nie potrzebujesz-name *.*
żadnego, chyba że chcesz tylko pliki z kropką gdzieś w nazwie. To jest glob systemu Windows, a nie * nix.find
doxargs
zakończy się niepowodzeniem, jeślifind
pasuje do plików zawierających spacje, cudzysłowy lub inne metaznaki powłoki w ścieżce. Przynajmniej użyjfind blog -type f -print0 | xargs -0 dos2unix
do obsługi przypadków białych znaków. Aby uniknąć cudzysłowów, itp. Musisz używaćfind
s-exec
zamiast potoków.dos2unix
Strona podręcznika nie określa, jakie będzie zachowanie, jeśli wywołasz ją na plikach binarnych. Jeśli konwertuje CRLF w plikach binarnych, uszkodzi je. Zobacz moją odpowiedź na bezpieczniejszą, choć dłuższą alternatywę.Zakładając, że masz GNU
grep
iperl
to spowoduje rekurencyjną konwersję CRLF na LF w niebinarnych plikach w bieżącym katalogu:Jak to działa
Znajdź rekurencyjnie w bieżącym katalogu; zmieni
.
sięblog
lubwhatev
podkatalogów ograniczyć wymianę:Dopasuj tylko zwykłe pliki:
Sprawdź, czy plik zawiera CRLF. Wyklucz pliki binarne. Uruchamia
grep
polecenie dla każdego zwykłego pliku. Taka jest cena wykluczenia plików binarnych. Jeśli masz starą wersję,grep
możesz spróbować zbudować test za pomocąfile
polecenia:Zastąp CRLF LF. Z
'+'
drugim-exec
polecafind
gromadzenie pasujących plików i przekazywanie ich do jednego (lub jak najmniejszej możliwej liczby) wywołań polecenia - jak potokowanie doxargs
, ale bez problemów, jeśli ścieżka pliku zawiera spacje, cudzysłowy lub inne metaznaki powłoki.i
W-pi
mówi Perl zmodyfikować plik na swoim miejscu. Mógłbyś użyćsed
lubawk
tutaj z jakąś pracą i prawdopodobnie zmienisz '+' na ';' i wywołaj oddzielny proces dla każdego dopasowania:źródło
grep -qIP '\r\n'
nigdy nie pasuje do niczego w moim systemie CentOS. Zmieniam to nagrep -qIP '\r$'
działające.node_modules
?find
część polecenia, aby wykluczyć katalogi. Sugerują użycie-path
, ale możesz też użyć-regex
lub-iregex
, tj.-not -regex '.*/node_modules/.*'
Który wykluczy anode_modules
na dowolnej głębokości.regex
lubbash
noob, ale co z wielu wyłączeń, powiedziećnode_module
idist
na przykład?-P
Flaga GNU grep jest wymagana . OS X przełączył się z GNU grep na BSD grep. Niektóre alternatywy dla OS X: stackoverflow.com/questions/16658333/ ...Oto lepsza opcja: Swiss File Knife . Działa rekurencyjnie w podkatalogach i poprawnie obsługuje spacje i znaki specjalne.
Wszystko co musisz zrobić to:
Bonus: sfk wykonuje również wiele innych konwersji. Zobacz poniżej pełną listę:
EDYCJA: uwaga: zachowaj ostrożność podczas uruchamiania tego na folderach z plikami binarnymi, ponieważ skutecznie zniszczy twoje pliki, szczególnie katalogi .git . Jeśli tak jest w Twoim przypadku, nie uruchamiaj sfk w całym folderze, ale zamiast tego wybierz określone rozszerzenia plików (* .rb, * .py itp.). Przykład:
sfk remcr -dir chef -file .rb -file .json -file .erb -file .md
źródło
sfk
skutecznie przetworzyłem cały mój folder .git i zniszczyłem kilka plików binarnych (stąd moja edycja ; nie pamiętam, czy to był Linux czy Mac). Mogli zmienić domyślne zachowanie w nowszych wersjach, ale dla bezpieczeństwa nadal zalecam określenie rozszerzenia.Jest to o wiele bezpieczniejsze, ponieważ pozwala uniknąć uszkodzenia repozytorium git. Dodaj lub zamień .git, .svn na .bzr, .hg lub jakiekolwiek źródło kontrolujące twoje użycie na liście nie .
źródło
Na OS X to działało dla mnie:
Ostrzeżenie: przed wykonaniem tego polecenia wykonaj kopię zapasową katalogu.
źródło
Oto rozwiązanie, jeśli używasz seda:
-i
oznacza w miejscu, jeśli chcesz również utworzyć kopię zapasową, użyj-i.bak
's/\r$//'
zamieni wszystkie znaki powrotu karetki (\r
) na końcu każdego wierszaźródło