Làm cách nào tôi có thể chạy dos2unix trên toàn bộ thư mục? [đóng cửa]


332

Tôi phải chuyển đổi toàn bộ thư mục bằng cách sử dụng dos2unix. Tôi không thể tìm ra cách để làm điều này.

Câu trả lời:


589

find . -type f -print0 | xargs -0 dos2unix

Sẽ đệ quy tìm tất cả các tệp trong thư mục hiện tại và gọi cho các tệp này lệnh dos2unix


94
Sẽ phá vỡ nếu bạn có khoảng trắng trong tên tệp. find . -type f -print0 | xargs -0 dos2unixtôi sẽ giải quyết vấn đề
Noufal Ibrahim

1
tôi đã tìm thấy như thế này -type f -exec dos2unix {} / home / venuk / Desktop / NEO_Src và nó đã đưa ra lỗi tìm: thiếu đối số cho `-exec '
Vivek Gaur

1
Lưu ý dấu gạch chéo ngược thoát khỏi dấu chấm phẩy đảm bảo các lệnh dos2unix được phân tách bằng dấu chấm phẩy để chúng không bị trộn lẫn với nhau. Nếu bạn muốn chạy một lệnh khác sau đó, bạn sẽ cần một dấu chấm phẩy khác, vì vậy\;; echo Hello
Josh

1
Tuy nhiên, hãy cẩn thận với lệnh này, nó không kiểm tra xem tệp có cần chuyển đổi hay không, do đó, ngay cả các tệp nhị phân cũng sẽ bị "chuyển đổi", làm hỏng chúng.
vguzmanp

2
@vguzmanp Đúng, lệnh findgọi không thực hiện kiểm tra này (mặc dù điều đó đủ đơn giản để thêm vào), nhưng hiện đại dos2unixbỏ qua các tệp nhị phân chính xác.
Kyle Strand

67

Nếu đó là một thư mục lớn, bạn có thể muốn xem xét việc chạy với nhiều bộ xử lý:

find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix 

Điều này sẽ vượt qua 1 tệp cùng một lúc và sử dụng 4 bộ xử lý.


1
Phương pháp này có lợi thế là nó vẫn tiếp tục, mặc dù dos2unix gặp phải bất kỳ vấn đề nào! Một cái gì đó giống như một phương pháp "- lực lượng". Cảm ơn vì điều đó!
miễn phí

Wow - vừa tiết kiệm cho tôi rất nhiều thời gian giải quyết vấn đề trong khi cố gắng chuyển đổi bổ sung mã nhà phát triển Windows đã thêm giường vào git không chính xác. Cảm ơn bạn!!
NetYeti

1
Bắt đầu một quy trình dos2unix mới cho mỗi tệp riêng lẻ sẽ giới thiệu chi phí không cần thiết ồ ạt. Tôi sẽ nnâng nó lên theo một hoặc hai độ lớn (tùy thuộc vào số lượng tệp chúng ta đang nói ở đây)
JonoCoetzee

25

Khi tôi cảm thấy hài lòng với dos2unix, tôi đã sử dụng tiện ích đơn giản của riêng mình. Ngoài một vài lợi thế về tốc độ và khả năng dự đoán, cú pháp cũng đơn giản hơn một chút:

endlines unix *

Và nếu bạn muốn nó đi vào các thư mục con (bỏ qua các thư mục ẩn và các tệp không phải là văn bản):

endlines unix -r .

endlinescó sẵn ở đây https://github.com/mdolidon/endlines


1
Đây là hoàn hảo! Lớp lót gần nhất tôi có thể có ở đây: unix.stackexchange.com/a/365679/112190
phyatt

2
Làm thế nào để nó cải thiện dos2unix? Thực sự tò mò.
Walf

3
1 / Chủ yếu, có hàng tấn khác nhau dos2unix, với các khả năng khác nhau (một số đọc UTF32 chẳng hạn, trong khi một số thì không; endlines thì không). Chỉ có một endlines, những khả năng được biết đến. 2 / tự do về đầu vào, không phải tất cả dos2unixđều được. 3 / thăm dò cây tập tin hiệu quả, được thiết kế để nhanh chóng và thiết thực trên hàng chục ngàn tệp. 4 / hết hộp trên OSX - điều ít quan trọng hơn bây giờ là gói Brew tồn tại.
Mathias Dolidon

1
Trong trường hợp của tôi, đó chính xác là những gì tôi cần cảm ơn rất nhiều. Các tính năng được chào đón là cách dễ dàng để xử lý cây thư mục và thời gian thực hiện nhanh.
AlSavi

17

Có lẽ tốt nhất là bỏ qua các tệp và thư mục ẩn, chẳng hạn như .git.Thay vì sử dụng find, nếu bashphiên bản của bạn đủ gần đây hoặc nếu bạn đang sử dụng zsh, chỉ cần làm:

dos2unix **

Lưu ý rằng đối với Bash, điều này sẽ yêu cầu:

shopt -s globstar

.... nhưng đây là một tính năng đủ hữu ích mà bạn nên thành thật chỉ cần đặt nó trong .bashrcdù sao đi nữa.

Nếu bạn không muốn bỏ qua các tệp và thư mục bị ẩn, nhưng bạn vẫn không muốn gây rối với find(và tôi sẽ không đổ lỗi cho bạn), bạn có thể cung cấp một đối số đệ quy toàn cầu thứ hai để chỉ khớp với các mục bị ẩn:

dos2unix ** **/.*

Lưu ý rằng trong cả hai trường hợp, toàn cầu sẽ mở rộng để bao gồm các thư mục, vì vậy bạn sẽ thấy cảnh báo sau (có khả năng nhiều lần hơn): Skipping <dir>, not a regular file.


1
Điều này đã không làm việc cho tôi. Cú pháp của sao có hoạt động với dos2unix không? Tôi đã sử dụng Glostar ở những nơi khác thành công, nhưng không thể làm việc này được. Tôi đang sử dụng Bash 4.3.11 (1)
NS du Toit

@NSduToit * Các shell kiểu NIX không cho phép các tệp thực thi thay đổi hành vi mở rộng đối số, bởi vì (không giống như trong Windows) mở rộng đối số được thực hiện trước khi thực thi nhận được các đối số. Vì vậy, điều duy nhất tôi có thể nghĩ là bạn có một số dos2unixbí danh ảnh hưởng đến cách mở rộng đối số. Đầu ra type dos2unixtrên hệ thống của bạn là gì?
Kyle Strand

1
@NSduToit Có một số nhầm lẫn ở đây. Câu trả lời của tôi nói rõ rằng điểm sử dụng **thay vì findlà "bỏ qua các tệp và thư mục ẩn, chẳng hạn như .git". dos2unixkhông bao giờ nhìn thấy các tập tin ẩn, bởi vì **không mở rộng để hiển thị chúng. Nếu bạn muốn tự động chạy dos2unixtrên các tệp và thư mục ẩn, bạn có thể sử dụng findhoặc dos2unix ** **/.*The **/.*sẽ chỉ mở rộng các tệp và thư mục ẩn, bao gồm .(thư mục gốc), ..(thư mục gốc) và bất kỳ mục ẩn nào khác trong thư mục hiện tại.
Kyle Strand

1
(Lưu ý rằng dos2unixchỉ cần in Skipping <dir>, not a regular file.khi chạy trên một thư mục, vì vậy chạy trên ...an toàn.) Ngoài ra, kết hợp lsvới một quả cầu không phải là một cách tốt để kiểm tra xem toàn cầu được mở rộng như thế nào; sử dụng echothay thế: echo **sẽ in các đối số dos2unixnhận được từ dos2unix **.
Kyle Strand

1
Cảm ơn bạn! Có ý nghĩa! Được rồi, tôi đã có một ý tưởng hoàn toàn sai về những gì **ngụ ý, và sử dụng echolàm cho nó rõ ràng.
NS du Toit

7

Một trường hợp sử dụng phổ biến dường như là để chuẩn hóa các kết thúc dòng cho tất cả các tệp được cam kết với kho Git :

git ls-files | xargs dos2unix

Hãy ghi nhớ rằng các tệp nhất định (ví dụ *.sln, *.bat) vv đều chỉ được sử dụng trên hệ điều hành Windows và nên giữ cho các CRLFkết thúc:

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

Nếu cần thiết, sử dụng .gitattributes


6

Đối với bất kỳ người dùng Solaris nào (đang sử dụng 5.10, cũng có thể áp dụng cho các phiên bản mới hơn, cũng như các hệ thống unix khác):

dos2unix không mặc định ghi đè tập tin, nó sẽ chỉ in phiên bản cập nhật thành thiết bị xuất chuẩn, do đó bạn sẽ phải chỉ định nguồn và đích, tức là cùng tên hai lần:

find . -type f -exec dos2unix {} {} \;

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

1
Chào mừng bạn đến với Stack Overflow. Mặc dù giải pháp của bạn là một giải pháp hợp lệ, nhưng sẽ thật tuyệt nếu bạn có thể thêm một số lời giải thích cho nó. Bạn cũng có thể xem xét để tham khảo các câu trả lời khác để biện minh cho câu trả lời của bạn. Xin vui lòng xem Làm thế nào để trả lời để biết thêm thông tin.
kaugeour

2

Tôi đã có cùng một vấn đề và nhờ những bài viết ở đây tôi đã giải quyết nó. Tôi biết rằng tôi có khoảng một trăm tệp và tôi chỉ cần chạy nó cho các tệp * .js. find . -type f -name '*.js' -print0 | xargs -0 dos2unix

Cảm ơn mọi sự giúp đỡ của bạn.


0

Tôi nghĩ cách đơn giản nhất là:

dos2unix $(find . -type f)

0

Tôi đã googled điều này như một triệu lần, vì vậy giải pháp của tôi là chỉ đưa chức năng bash này vào môi trường của bạn.

.bashrchoặc .profilebất cứ điều gì

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

Sử dụng

$ dos2unixd ./somepath

Bằng cách này, bạn vẫn có lệnh gốc dos2unixvà thật dễ dàng để nhớ lệnh này dos2unixd.


-1

Nếu không có thư mục con, bạn cũng có thể lấy

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

4
Nếu không có thư mục con, dos2unix *đơn giản hơn và thực sự sẽ mạnh hơn thế này. (Nó thường không được khuyến khích để ống đầu ra của ls, bởi vì nó là một công cụ định dạng và *đáng tin cậy hơn cho việc sử dụng chương trình.)
Kyle Strand

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.