Bagaimana saya bisa menjalankan dos2unix di seluruh direktori? [Tutup]


333

Saya harus mengonversi seluruh direktori menggunakan dos2unix. Saya tidak dapat menemukan cara untuk melakukan ini.

Jawaban:


591

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


94
Akan pecah jika Anda memiliki spasi dalam nama file. find . -type f -print0 | xargs -0 dos2unixakan memecahkan masalah yang saya pikir.
Noufal Ibrahim

1
saya berikan seperti ini. -type f -ex dos dosunun {} / home / venuk / Desktop / NEO_Src dan itu memberikan kesalahan menemukan: argumen hilang ke `-exec '
Vivek Gaur

1
Perhatikan backslash yang lolos dari semi-colon memastikan perintah dos2unix dipisahkan oleh semi-titik dua sehingga mereka tidak berakhir tumbuk bersama. Jika Anda ingin menjalankan perintah lain setelahnya, Anda akan memerlukan semi-kolon lagi, jadi\;; echo Hello
Yos

1
Hati-hati dengan perintah ini, itu tidak memeriksa apakah file tersebut perlu konversi, sehingga bahkan file biner akan "dikonversi", merusaknya.
vguzmanp

2
@vguzmanp Benar, findpermohonan tidak melakukan pemeriksaan ini (meskipun itu akan cukup sederhana untuk ditambahkan), tetapi modern dos2unixdengan benar melewatkan file biner.
Kyle Strand

68

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.


1
Metode ini memiliki kelebihan, yang terus berlanjut, meskipun dos2unix menemui masalah! Sesuatu seperti metode "--force". Terima kasih untuk itu!
freeo

Wow - baru saja menyelamatkan saya banyak waktu penyelesaian masalah ketika mencoba untuk mengkonversi tambahan kode pengembang Windows yang telah ditambahkan ke git salah. Terima kasih!!
The NetYeti

1
Memulai proses dos2unix baru untuk setiap file individu akan memperkenalkan overhead yang tidak perlu secara besar-besaran. Saya akan nmeningkatkannya dengan urutan satu atau dua (tergantung pada berapa banyak file yang kita bicarakan di sini)
JonoCoetzee

25

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 .

endlinestersedia di sini https://github.com/mdolidon/endlines


1
Ini sempurna! Satu-liner terdekat yang bisa saya dapatkan adalah di sini: unix.stackexchange.com/a/365679/112190
phyatt

2
Bagaimana cara meningkatkannya dos2unix? Sangat penasaran.
Walf

3
1 / Terutama, ada berton-ton yang berbeda 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.
Mathias Dolidon

1
Dalam kasus saya, itulah tepatnya yang saya butuhkan, terima kasih banyak. Fitur yang diterima adalah cara mudah untuk memproses pohon direktori dan waktu eksekusi yang cepat.
AlSavi

17

Mungkin lebih baik untuk melewatkan file dan folder tersembunyi, seperti .git.Jadi daripada menggunakan find, jika bashversi 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.


1
Ini tidak berhasil untuk saya. Apakah sintaks globstar berfungsi untuk dos2unix? Saya menggunakan globstar di tempat lain dengan sukses, tetapi tidak berhasil. Saya menggunakan Bash 4.3.11 (1)
NS du Toit

@NSduToit * kerang gaya NIX tidak memungkinkan executable untuk mengubah perilaku argumen-ekspansi, karena (tidak seperti di Windows) perluasan-argumen dilakukan sebelum executable pernah menerima argumen. Jadi satu-satunya hal yang dapat saya pikirkan adalah bahwa Anda memiliki semacam dos2unixalias yang mempengaruhi bagaimana argumen diperluas. Apa output type dos2unixpada sistem Anda?
Kyle Strand

1
@NSduToit Ada beberapa kebingungan di sini. Jawaban saya secara eksplisit menyatakan bahwa titik menggunakan **bukan findadalah untuk "melewatkan file dan folder tersembunyi, seperti .git". dos2unixtidak pernah melihat file yang disembunyikan, karena **tidak diperluas untuk memperlihatkannya. Jika Anda ingin untuk secara otomatis menjalankan dos2unixpada file dan folder tersembunyi, Anda dapat menggunakan findatau dos2unix ** **/.*The **/.*akan memperluas hanya file tersembunyi dan folder, termasuk .(root dir), ..(induk dir), dan setiap entri tersembunyi lainnya dalam folder saat ini.
Kyle Strand

1
(Perhatikan bahwa dos2unixhanya mencetak Skipping <dir>, not a regular file.ketika dijalankan pada direktori, jadi jalankan ..dan .aman.) Selain itu, menggabungkan lsdengan bola bukanlah cara yang baik untuk memeriksa bagaimana bola diperluas; gunakan echosebaliknya: echo **akan mencetak argumen yang dos2unixmenerima dari dos2unix **.
Kyle Strand

1
Terima kasih! Masuk akal! Oke, saya punya ide yang benar-benar salah tentang apa yang **tersirat, dan menggunakan echomembuatnya menjadi jelas.
NS du Toit

7

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 CRLFberakhir:

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

Jika perlu, gunakan .gitattributes


6

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 {} {} \;

2
for FILE in /var/www/html/files/*
do
 /usr/bin/dos2unix FILE
done

1
Selamat datang di Stack Overflow. Meskipun solusi Anda adalah solusi yang valid, alangkah baiknya jika Anda dapat menambahkan beberapa penjelasan padanya. Anda mungkin juga mempertimbangkan untuk referensi jawaban lain untuk membenarkan jawaban Anda. Silakan lihat Cara Menjawab untuk informasi lebih lanjut.
kvantour

2

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.


0

Saya pikir cara paling sederhana adalah:

dos2unix $(find . -type f)

0

Saya sudah googled ini seperti jutaan kali, jadi solusi saya adalah dengan menempatkan fungsi bash ini di lingkungan Anda.

.bashrcatau .profileatau apalah

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

Pemakaian

$ dos2unixd ./somepath

Dengan cara ini Anda masih memiliki perintah asli dos2unixdan mudah diingat yang ini dos2unixd.


-1

Jika tidak ada sub-direktori, Anda juga dapat mengambilnya

ls | xargs -I {} dos2unix "{}"

4
Jika tidak ada subdirektori, 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.)
Kyle Strand

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.