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
find
wywołanie nie wykonuje tej kontroli (chociaż byłoby to wystarczająco proste, aby dodać), ale nowoczesne dos2unix
poprawnie 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.
n
o 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 .
endlines
jest 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 dos2unix
są. 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 bash
wersja 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.
dos2unix
alias, który wpływa na sposób rozszerzania argumentów. Jaka jest wydajność type dos2unix
Twojego systemu?
**
zamiast find
jest „skip ukryte pliki i foldery, takie jak .git
”. dos2unix
nigdy nie widzi ukrytych plików, ponieważ **
nie rozwija się, aby je pokazać. Jeśli chcesz automatycznie uruchamiać dos2unix
ukryte pliki i foldery, możesz użyć find
lub dos2unix ** **/.*
The **/.*
rozwinie tylko ukryte pliki i foldery, w tym .
(katalog główny), ..
( katalog macierzysty) i wszelkie inne ukryte wpisy w bieżącym folderze.
dos2unix
po prostu drukuje Skipping <dir>, not a regular file.
po uruchomieniu w katalogu, więc działa ..
i .
jest bezpieczny.) Dodatkowo, połączenie ls
z glob nie jest dobrym sposobem na sprawdzenie, jak glob jest rozwijany; użyj echo
zamiast tego: echo **
wypisuje argumenty, które dos2unix
otrzymuje dos2unix **
.
**
, co to sugeruje, a używanie echo
wyjaś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.
.bashrc
lub .profile
cokolwiek
dos2unixd() {
find $1 -type f -print0 | xargs -0 dos2unix
}
Stosowanie
$ dos2unixd ./somepath
W ten sposób nadal masz oryginalne polecenie dos2unix
i ł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 dos2unix
rozwiązałbym problem, tak myślę.