Saya harus mengonversi seluruh direktori menggunakan dos2unix
. Saya tidak dapat menemukan cara untuk melakukan ini.
Saya harus mengonversi seluruh direktori menggunakan dos2unix
. Saya tidak dapat menemukan cara untuk melakukan ini.
Jawaban:
find . -type f -print0 | xargs -0 dos2unix
Akan secara rekursif menemukan semua file di dalam direktori saat ini dan memanggil file ini dengan perintah dos2unix
\;; echo Hello
find
permohonan tidak melakukan pemeriksaan ini (meskipun itu akan cukup sederhana untuk ditambahkan), tetapi modern dos2unix
dengan benar melewatkan file biner.
Jika itu direktori besar, Anda mungkin ingin mempertimbangkan untuk menjalankan dengan beberapa prosesor:
find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix
Ini akan melewati 1 file sekaligus, dan menggunakan 4 prosesor.
n
meningkatkannya dengan urutan satu atau dua (tergantung pada berapa banyak file yang kita bicarakan di sini)
Ketika saya kurang puas dengan dos2unix, saya meluncurkan utilitas sederhana saya sendiri. Terlepas dari beberapa keunggulan dalam kecepatan dan prediktabilitas, sintaksisnya juga sedikit lebih sederhana:
endlines unix *
Dan jika Anda ingin masuk ke subdirektori (melewatkan direktori tersembunyi dan file non-teks):
endlines unix -r .
endlines
tersedia di sini https://github.com/mdolidon/endlines
dos2unix
? Sangat penasaran.
dos2unix
, dengan kemampuan yang berbeda-beda (beberapa membaca UTF32 misalnya, sementara beberapa tidak; endline tidak). Hanya ada satu endlines
, yang kemampuannya sudah terkenal. 2 / liberal pada input, tidak semua dos2unix
. 3 / eksplorasi pohon file efisien, dirancang agar cepat dan praktis pada puluhan ribu file. 4 / kehabisan kotak pada OSX - yang kurang penting sekarang karena paket Brew ada.
Mungkin lebih baik untuk melewatkan file dan folder tersembunyi, seperti .git.
Jadi daripada menggunakan find
, jika bash
versi Anda cukup baru atau jika Anda menggunakan zsh
, lakukan saja:
dos2unix **
Perhatikan bahwa untuk Bash, ini membutuhkan:
shopt -s globstar
.... tetapi ini adalah fitur yang cukup berguna sehingga Anda harus jujur saja memasukkannya ke dalam Anda .bashrc
.
Jika Anda tidak ingin melewatkan file dan folder tersembunyi, tetapi Anda tetap tidak ingin mengacaukannya find
(dan saya tidak akan menyalahkan Anda), Anda dapat memberikan argumen rekursif-glob kedua untuk mencocokkan hanya entri yang tersembunyi:
dos2unix ** **/.*
Perhatikan bahwa dalam kedua kasus, gumpalan akan diperluas untuk memasukkan direktori, sehingga Anda akan melihat peringatan berikut (berulang kali berpotensi): Skipping <dir>, not a regular file.
dos2unix
alias yang mempengaruhi bagaimana argumen diperluas. Apa output type dos2unix
pada sistem Anda?
**
bukan find
adalah untuk "melewatkan file dan folder tersembunyi, seperti .git
". dos2unix
tidak pernah melihat file yang disembunyikan, karena **
tidak diperluas untuk memperlihatkannya. Jika Anda ingin untuk secara otomatis menjalankan dos2unix
pada file dan folder tersembunyi, Anda dapat menggunakan find
atau dos2unix ** **/.*
The **/.*
akan memperluas hanya file tersembunyi dan folder, termasuk .
(root dir), ..
(induk dir), dan setiap entri tersembunyi lainnya dalam folder saat ini.
dos2unix
hanya mencetak Skipping <dir>, not a regular file.
ketika dijalankan pada direktori, jadi jalankan ..
dan .
aman.) Selain itu, menggabungkan ls
dengan bola bukanlah cara yang baik untuk memeriksa bagaimana bola diperluas; gunakan echo
sebaliknya: echo **
akan mencetak argumen yang dos2unix
menerima dari dos2unix **
.
**
tersirat, dan menggunakan echo
membuatnya menjadi jelas.
Kasus penggunaan umum tampaknya adalah untuk membakukan akhir baris untuk semua file yang dikomit ke repositori Git :
git ls-files | xargs dos2unix
Perlu diingat bahwa file tertentu (misalnya *.sln
, *.bat
) dll hanya digunakan pada sistem operasi Windows dan harus tetap yang CRLF
berakhir:
git ls-files '*.sln' '*.bat' | xargs unix2dos
Jika perlu, gunakan .gitattributes
Untuk setiap pengguna Solaris (saya menggunakan 5.10, dapat berlaku untuk versi yang lebih baru juga, serta sistem unix lainnya):
dos2unix tidak default untuk menimpa file, itu hanya akan mencetak versi yang diperbarui ke stdout, jadi Anda harus menentukan sumber dan target, yaitu nama yang sama dua kali:
find . -type f -exec dos2unix {} {} \;
for FILE in /var/www/html/files/*
do
/usr/bin/dos2unix FILE
done
Saya memiliki masalah yang sama dan terima kasih untuk posting di sini saya telah menyelesaikannya. Saya tahu bahwa saya memiliki sekitar seratus file dan saya perlu menjalankannya untuk file * .js saja.
find . -type f -name '*.js' -print0 | xargs -0 dos2unix
Terima kasih atas bantuannya.
Saya sudah googled ini seperti jutaan kali, jadi solusi saya adalah dengan menempatkan fungsi bash ini di lingkungan Anda.
.bashrc
atau .profile
atau apalah
dos2unixd() {
find $1 -type f -print0 | xargs -0 dos2unix
}
Pemakaian
$ dos2unixd ./somepath
Dengan cara ini Anda masih memiliki perintah asli dos2unix
dan mudah diingat yang ini dos2unixd
.
Jika tidak ada sub-direktori, Anda juga dapat mengambilnya
ls | xargs -I {} dos2unix "{}"
dos2unix *
lebih sederhana dan sebenarnya akan lebih kuat dari ini. (Umumnya tidak disarankan untuk menyalurkan output ls
, karena merupakan alat pemformatan dan *
lebih dapat diandalkan untuk penggunaan terprogram.)
find . -type f -print0 | xargs -0 dos2unix
akan memecahkan masalah yang saya pikir.