Jak mogę uruchomić dos2unix na całym katalogu? [Zamknięte]

Odpowiedzi:

591

find . -type f -print0 | xargs -0 dos2unix

Rekurencyjnie znajdzie wszystkie pliki w bieżącym katalogu i wezwie te pliki do polecenia dos2unix

CyberDem0n
źródło
94
Zepsułby się, gdybyś miał spacje w nazwie pliku. find . -type f -print0 | xargs -0 dos2unixrozwiązałbym problem, tak myślę.
Noufal Ibrahim,
1
Dałem w ten sposób znalezisko. -type f -exec dos2unix {} / home / venuk / Desktop / NEO_Src i dało błąd find: brak argumentu w `-exec '
Vivek Gaur
1
Zwróć uwagę, że ukośnik odwrotny, który ucieka przed średnikiem, zapewnia, że ​​polecenia dos2unix są oddzielone średnikami, aby nie zostały zmiksowane razem. Jeśli chcesz później wykonać kolejne polecenie, będziesz potrzebować innego średnika, więc\;; echo Hello
Josh
1
Uważaj jednak na to polecenie, nie sprawdza ono, czy plik wymaga konwersji, więc nawet pliki binarne zostaną „przekonwertowane”, powodując ich uszkodzenie.
vguzmanp
2
@vguzmanp To prawda, że findwywołanie nie wykonuje tej kontroli (chociaż byłoby to wystarczająco proste, aby dodać), ale nowoczesne dos2unixpoprawnie pomija pliki binarne.
Kyle Strand
68

Jeśli jest to duży katalog, możesz rozważyć uruchomienie go z wieloma procesorami:

find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix 

Spowoduje to przekazanie 1 pliku na raz i wykorzystanie 4 procesorów.

nikc
źródło
1
Zaletą tej metody jest jej kontynuacja, nawet jeśli dos2unix napotka jakiekolwiek problemy! Coś jak metoda „--force”. Dziękuję za to!
freeo
Wow - po prostu zaoszczędziłem dużo czasu na rozwiązywanie problemów podczas próby konwersji dodatków kodu programistów Windows, które źle dodały łóżko do git. Dziękuję Ci!!
NetYeti
1
Rozpoczęcie nowego procesu dos2unix dla każdego pojedynczego pliku wprowadzi niepotrzebny narzut. Zwiększyłbym to no rząd wielkości lub dwa (w zależności od liczby plików, o których tu mówimy)
JonoCoetzee
25

Poniewaz dos2unix bardzo mnie nie usatysfakcjonowal, uruchomilem wlasne proste narzędzie. Oprócz kilku zalet szybkości i przewidywalności, składnia jest również nieco prostsza:

endlines unix *

A jeśli chcesz, aby zszedł do podkatalogów (pomijając ukryte katalogi i pliki nietekstowe):

endlines unix -r .

endlinesjest dostępny tutaj https://github.com/mdolidon/endlines

Mathias Dolidon
źródło
1
To jest doskonałe! Najbliższy liniowiec, jaki mogłem do tego dostać, jest tutaj: unix.stackexchange.com/a/365679/112190
phyatt
2
Jak to się poprawia dos2unix? Naprawdę ciekawy.
Walf
3
1 / Głównie istnieją tony różnych dos2unix, o różnych możliwościach (niektóre na przykład czytają UTF32, a inne nie; linie końcowe nie.) Jest tylko jedna endlines, której możliwości są dobrze znane. 2 / liberalny na wejściu, nie wszyscy dos2unixsą. 3 / wydajna eksploracja drzewa plików, zaprojektowana tak, aby była szybka i praktyczna w przypadku dziesiątek tysięcy plików. 4 / wychodzi z pudełka na OSX - co jest mniej ważne teraz, gdy istnieje pakiet Brew.
Mathias Dolidon
1
W moim przypadku jest to dokładnie to, czego potrzebowałem, dzięki. Funkcje, które są mile widziane, to łatwy sposób na przetworzenie drzewa katalogów i szybki czas wykonania.
AlSavi
17

Prawdopodobnie najlepiej pominąć ukryte pliki i foldery, takie jak .git.So, zamiast używać find, jeśli Twoja bashwersja jest wystarczająco aktualna lub jeśli używasz zsh, po prostu wykonaj:

dos2unix **

Pamiętaj, że w przypadku Bash będzie to wymagało:

shopt -s globstar

.... ale jest to na tyle użyteczna funkcja, że ​​i tak powinieneś ją po prostu włożyć .bashrc.

Jeśli nie chcesz pomijać ukrytych plików i folderów, ale nadal nie chcesz zadzierać find(i nie winiłbym cię), możesz podać drugi argument glob rekurencyjny, aby dopasować tylko ukryte wpisy:

dos2unix ** **/.*

Zauważ, że w obu przypadkach glob rozszerzy się o katalogi, więc zobaczysz następujące ostrzeżenie (potencjalnie wiele razy): Skipping <dir>, not a regular file.

Kyle Strand
źródło
1
To mi nie zadziałało. Czy składnia globstar działa dla dos2unix? Z powodzeniem korzystałem z globstar gdzie indziej, ale nie mogłem tego uruchomić. Używam Bash 4.3.11 (1)
NS du Toit
@NSduToit * Powłoki w stylu NIX nie zezwalają plikom wykonywalnym na zmianę zachowania interpretacji argumentów, ponieważ (inaczej niż w Windowsie) interpretacja argumentów jest wykonywana przed otrzymaniem argumentów przez plik wykonywalny. Mogę tylko myśleć o tym, że masz jakiś dos2unixalias, który wpływa na sposób rozszerzania argumentów. Jaka jest wydajność type dos2unixTwojego systemu?
Kyle Strand
1
@NSduToit Jest tu trochę zamieszania. Moja odpowiedź wyraźnie stwierdza, że punkt używania **zamiast findjest „skip ukryte pliki i foldery, takie jak .git”. dos2unixnigdy nie widzi ukrytych plików, ponieważ **nie rozwija się, aby je pokazać. Jeśli chcesz automatycznie uruchamiać dos2unixukryte pliki i foldery, możesz użyć findlub dos2unix ** **/.*The **/.*rozwinie tylko ukryte pliki i foldery, w tym .(katalog główny), ..( katalog macierzysty) i wszelkie inne ukryte wpisy w bieżącym folderze.
Kyle Strand
1
(Pamiętaj, że dos2unixpo prostu drukuje Skipping <dir>, not a regular file.po uruchomieniu w katalogu, więc działa ..i .jest bezpieczny.) Dodatkowo, połączenie lsz glob nie jest dobrym sposobem na sprawdzenie, jak glob jest rozwijany; użyj echozamiast tego: echo **wypisuje argumenty, które dos2unixotrzymuje dos2unix **.
Kyle Strand
1
Dziękuję Ci! Ma sens! Okej, miałem zupełnie błędne wyobrażenie o tym **, co to sugeruje, a używanie echowyjaśnia.
NS du Toit
7

Typowym przykładem użycia wydaje się być standaryzacja zakończeń linii dla wszystkich plików zapisanych w repozytorium Git :

git ls-files | xargs dos2unix

Należy pamiętać, że niektóre pliki (np *.sln, *.bat) etc są wyłącznie używane w systemach operacyjnych Windows i powinien zachowaćCRLF kończąc:

git ls-files '*.sln' '*.bat' | xargs unix2dos

W razie potrzeby użyj .gitattributes

friederbluemle
źródło
6

Każdy użytkownik systemu Solaris (korzystam z wersji 5.10, może dotyczyć także nowszych wersji, a także innych systemów unix):

dos2unix domyślnie nie zastępuje pliku, po prostu wydrukuje zaktualizowaną wersję na standardowe wyjście, więc będziesz musiał podać źródło i cel, tj. dwukrotnie tę samą nazwę:

find . -type f -exec dos2unix {} {} \;
Brett
źródło
2
for FILE in /var/www/html/files/*
do
 /usr/bin/dos2unix FILE
done
rafapedroche
źródło
1
Witamy w Stack Overflow. Chociaż twoje rozwiązanie jest poprawnym rozwiązaniem, byłoby wspaniale, gdybyś mógł dodać do niego jakieś wyjaśnienie. Możesz również odnieść się do innych odpowiedzi, aby uzasadnić swoją odpowiedź. Więcej informacji znajdziesz w artykule Jak odpowiedzieć .
kvantour
2

Miałem ten sam problem i dzięki postom tutaj go rozwiązałem. Wiedziałem, że mam około stu plików i musiałem go uruchomić tylko dla plików * .js. find . -type f -name '*.js' -print0 | xargs -0 dos2unix

Dziękuję wszystkim za pomoc.

Strabek
źródło
0

Myślę, że najprostszym sposobem jest:

dos2unix $(find . -type f)
Sahand
źródło
0

Googlowałem to milion razy, więc moim rozwiązaniem jest po prostu umieszczenie tej funkcji bash w twoim środowisku.

.bashrclub .profilecokolwiek

dos2unixd() {
  find $1 -type f -print0 | xargs -0 dos2unix
}

Stosowanie

$ dos2unixd ./somepath

W ten sposób nadal masz oryginalne polecenie dos2unixi łatwo je zapamiętać dos2unixd.

Ben Winding
źródło
-1

Jeśli nie ma podkatalogu, możesz również wziąć

ls | xargs -I {} dos2unix "{}"
Summer_More_More_Tea
źródło
4
Jeśli nie ma podkatalogów, dos2unix *jest to prostsze i faktycznie będzie bardziej niezawodne. (Generalnie nie jest zalecane przesyłanie danych wyjściowych ls, ponieważ jest to narzędzie do formatowania i *jest bardziej niezawodne w programowym użyciu).
Kyle Strand