Situasi berikut:
Saya sedang mengerjakan Mac yang menjalankan OS X dan baru-baru ini bergabung dengan sebuah proyek yang anggotanya semua menggunakan Windows. Salah satu tugas pertama saya adalah mengatur basis kode dalam repositori Git, jadi saya menarik pohon direktori dari FTP dan mencoba memeriksanya ke repo Git yang telah saya siapkan secara lokal. Ketika mencoba melakukan ini, yang saya dapatkan adalah ini
fatal: CRLF would be replaced by LF in blog/license.txt.
Karena ini mempengaruhi semua file di bawah folder "blog", saya mencari cara untuk dengan mudah mengkonversi SEMUA file di pohon ke Unix line-endings. Apakah ada alat yang melakukannya di luar kotak atau apakah saya mendapatkan skrip sendiri?
Untuk referensi, konfigurasi Git saya tentang akhir baris:
core.safecrlf=true
core.autocrlf=input
sumber
find blog -type f | xargs dos2unix
harus lebih cepat. Anda tidak memerlukan-name *.*
keduanya, kecuali Anda hanya menginginkan file dengan periode di suatu tempat di namanya. Itu windows glob, bukan yang * nix.find
kexargs
akan gagal jikafind
mencocokkan file dengan spasi, tanda kutip, atau karakter meta shell lain di jalurnya. Setidaknya gunakanfind blog -type f -print0 | xargs -0 dos2unix
untuk menangani kasus spasi putih. Anda harus menggunakanfind
's-exec
bukan pipa untuk menghindari kutipan, dll .. Thedos2unix
man page tidak menentukan apa yang perilakunya adalah jika Anda meminta itu pada file biner. Jika mengkonversi CRLF dalam file biner, itu akan merusaknya. Lihat jawaban saya untuk alternatif yang lebih aman dan lebih lama.Dengan asumsi Anda memiliki GNU
grep
danperl
ini akan secara rekursif mengkonversi CRLF ke LF dalam file non-biner di bawah direktori saat ini:Bagaimana itu bekerja
Temukan secara rekursif di bawah direktori saat ini; ubah
.
keblog
atauwhatev
subdirektori untuk membatasi penggantian:Hanya cocok dengan file biasa:
Uji apakah file berisi CRLF. Kecualikan file biner. Menjalankan
grep
perintah untuk setiap file biasa. Itu harga tidak termasuk binari. Jika Anda memiliki yang lama,grep
Anda bisa mencoba membuat tes menggunakanfile
perintah:Ganti CRLF dengan LF. The
'+'
dengan yang kedua-exec
memberitahufind
untuk mengakumulasi file yang cocok dan meneruskannya ke satu (atau sesedikit mungkin) pemanggilan perintah seperti perpipaanxargs
, tetapi tanpa masalah jika path file berisi spasi, tanda kutip, atau karakter meta shell lainnya. Thei
dalam-pi
memberitahu perl untuk memodifikasi file di tempat. Anda dapat menggunakansed
atau diawk
sini dengan beberapa pekerjaan, dan Anda mungkin akan mengubah '+' menjadi ';' dan meminta proses terpisah untuk setiap pertandingan:sumber
grep -qIP '\r\n'
tidak pernah cocok dengan apa pun di sistem CentOS saya. Mengubahnyagrep -qIP '\r$'
berfungsi.node_modules
?find
bagian dari perintah untuk mengecualikan direktori. Mereka menyarankan menggunakan-path
, tetapi Anda juga dapat menggunakan-regex
atau-iregex
, yaitu-not -regex '.*/node_modules/.*'
yang akan mengecualikannode_modules
pada kedalaman apa pun.regex
ataubash
noob, tetapi bagaimana dengan beberapa pengecualian, katakannode_module
dandist
misalnya?-P
bendera. OS X beralih dari GNU grep ke BSD grep. Beberapa alternatif untuk OS X: stackoverflow.com/questions/16658333/…Ini pilihan yang lebih baik: Pisau File Swiss . Ia bekerja secara rekursif di seluruh sub-direktori, dan menangani spasi dan karakter khusus dengan benar.
Yang harus Anda lakukan adalah:
Bonus: sfk juga melakukan banyak konversi lainnya. Lihat di bawah untuk daftar lengkap:
EDIT: kata hati-hati: hati-hati saat menjalankan ini pada folder yang memiliki file biner, karena akan secara efektif menghancurkan file Anda, khususnya direktori .git . Jika ini adalah kasus Anda, jangan tidak menjalankan sfk di seluruh folder, tapi pilih ekstensi file tertentu bukan (* Rb, * .py, dll). Contoh:
sfk remcr -dir chef -file .rb -file .json -file .erb -file .md
sumber
sfk
secara efektif memproses seluruh folder .git saya dan menghancurkan banyak binari (maka edit saya ; tidak ingat apakah itu Linux atau Mac). Mereka mungkin telah mengubah perilaku default di versi yang lebih baru, tetapi saya masih merekomendasikan untuk menentukan ekstensi, agar aman.Ini jauh lebih aman karena tidak merusak git repo Anda. Tambahkan atau ganti .git, .svn dengan .bzr, .hg atau sumber apa pun yang mengontrol penggunaan Anda ke daftar tidak .
sumber
Di OS X, ini berhasil bagi saya:
Peringatan: Harap cadangkan direktori Anda sebelum menjalankan perintah ini.
sumber
Di sini solusinya jika menggunakan sed:
-i
singkatan di tempat, jika Anda ingin membuat cadangan gunakan juga-i.bak
's/\r$//'
akan mengganti semua pengembalian carriage (\r
) di akhir setiap barissumber