Muszę przekonwertować cały katalog za pomocą dos2unix. Nie jestem w stanie wymyślić, jak to zrobić.
Muszę przekonwertować cały katalog za pomocą dos2unix. Nie jestem w stanie wymyślić, jak to zrobić.
Odpowiedzi:
find . -type f -print0 | xargs -0 dos2unix
Rekurencyjnie znajdzie wszystkie pliki w bieżącym katalogu i wezwie te pliki do polecenia dos2unix
\;; echo Hello
findwywołanie nie wykonuje tej kontroli (chociaż byłoby to wystarczająco proste, aby dodać), ale nowoczesne dos2unixpoprawnie pomija pliki binarne.
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.
no rząd wielkości lub dwa (w zależności od liczby plików, o których tu mówimy)
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
dos2unix? Naprawdę ciekawy.
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.
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.
dos2unixalias, który wpływa na sposób rozszerzania argumentów. Jaka jest wydajność type dos2unixTwojego systemu?
**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.
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 **.
**, co to sugeruje, a używanie echowyjaśnia.
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
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 {} {} \;
for FILE in /var/www/html/files/*
do
/usr/bin/dos2unix FILE
done
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.
Jeśli nie ma podkatalogu, możesz również wziąć
ls | xargs -I {} dos2unix "{}"
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).
find . -type f -print0 | xargs -0 dos2unixrozwiązałbym problem, tak myślę.