ฉันจะเรียกใช้ dos2unix ในไดเรกทอรีทั้งหมดได้อย่างไร [ปิด]


333

dos2unixฉันมีการแปลงสารบบทั้งหมดใช้ ฉันไม่สามารถหาวิธีการทำสิ่งนี้ได้

คำตอบ:


591

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

จะค้นหาไฟล์ทั้งหมดซ้ำภายในไดเรกทอรีปัจจุบันซ้ำและเรียกใช้ไฟล์เหล่านี้คำสั่ง dos2unix


94
จะแตกถ้าคุณมีช่องว่างในชื่อไฟล์ find . -type f -print0 | xargs -0 dos2unixจะแก้ปัญหาที่ฉันคิดว่า
Noufal Ibrahim

1
ฉันให้เช่นนี้พบ -type f -exec dos2unix {} / home / venuk / Desktop / NEO_Src และให้ข้อผิดพลาดในการค้นหา: อาร์กิวเมนต์ที่ขาดหายไปที่ `-exec '
Vivek Gaur

1
สังเกตว่าแบ็กสแลชที่หนีจากเซมิโคลอนทำให้แน่ใจว่าคำสั่ง dos2unix นั้นคั่นด้วยเซมิโคลอนเพื่อไม่ให้ถูกบดเข้าด้วยกัน หากคุณต้องการเรียกใช้คำสั่งอื่นหลังจากนั้นคุณจะต้องมีเซมิโคลอนอีกอันดังนั้น\;; echo Hello
23414 Josh Josh

1
ระวังด้วยคำสั่งนี้ แต่ก็ไม่ได้ตรวจสอบว่าไฟล์นั้นต้องการการแปลงหรือไม่ดังนั้นแม้ไฟล์ไบนารี่จะถูก "แปลง" ให้เสียหาย
vguzmanp

2
@vguzmanp True การfindเรียกใช้ไม่ได้ทำการตรวจสอบนี้ (แม้ว่าจะง่ายพอที่จะเพิ่ม) แต่ความทันสมัยdos2unixจะข้ามไฟล์ไบนารีอย่างถูกต้อง
Kyle Strand

68

หากเป็นไดเรกทอรีขนาดใหญ่คุณอาจต้องการลองใช้ตัวประมวลผลหลายตัว:

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

การดำเนินการนี้จะส่ง 1 ไฟล์ต่อครั้งและใช้โปรเซสเซอร์ 4 ตัว


1
วิธีนี้มีข้อดีคือมันยังคงต่อเนื่องแม้ว่า dos2unix จะพบปัญหาใด ๆ ! บางสิ่งเช่นวิธี "--force" ขอบคุณสำหรับสิ่งนั้น!
freeo

ว้าว - เพิ่งช่วยฉันแก้ปัญหาได้หลายครั้งในขณะที่พยายามแปลงการเพิ่มรหัสของนักพัฒนา Windows ที่มีการเพิ่มเบดให้คอมไพล์อย่างไม่ถูกต้อง ขอบคุณ!!
NetYeti

1
การเริ่มต้นกระบวนการ dos2unix ใหม่สำหรับแต่ละไฟล์จะแนะนำค่าใช้จ่ายที่ไม่จำเป็นอย่างหนาแน่น ฉันจะชนมันnตามลำดับความสำคัญหรือสองไฟล์ (ขึ้นอยู่กับจำนวนไฟล์ที่เรากำลังพูดถึงที่นี่)
JonoCoetzee

25

เมื่อฉันได้รับความพึงพอใจจาก dos2unix ฉันจึงได้ใช้เครื่องมือง่ายๆของฉัน นอกเหนือจากข้อดีเล็กน้อยในเรื่องความเร็วและการคาดการณ์ได้แล้วไวยากรณ์ยังง่ายขึ้นอีกเล็กน้อย:

endlines unix *

และถ้าคุณต้องการที่จะลงไปในไดเรกทอรีย่อย (ข้าม dirs ที่ซ่อนอยู่และไฟล์ที่ไม่ใช่ข้อความ):

endlines unix -r .

endlinesสามารถใช้ได้ที่นี่https://github.com/mdolidon/endlines


1
มันสมบูรณ์แบบ! ซับที่ใกล้ที่สุดที่ฉันสามารถไปถึงได้ที่นี่: unix.stackexchange.com/a/365679/112190
phyatt

2
ปรับปรุงได้dos2unixอย่างไร? อยากรู้อยากเห็นอย่างแท้จริง
Walf

3
1 / ส่วนใหญ่มีความแตกต่างกันdos2unixมากมายโดยมีความสามารถที่แตกต่างกัน (ตัวอย่างเช่น UTF32 บางอันอ่านในขณะที่บางตัวทำไม่ได้; มีเพียงหนึ่งendlinesความสามารถที่เป็นที่รู้จักกันดี 2 / เสรีนิยมกับการป้อนข้อมูลไม่ได้ทั้งหมดdos2unixที่มี 3 / การสำรวจต้นไม้ไฟล์ที่มีประสิทธิภาพออกแบบมาให้รวดเร็วและใช้งานได้จริงกับไฟล์นับหมื่น 4 / ไม่มีกล่องใน OSX - ซึ่งมีความสำคัญน้อยกว่าตอนนี้ที่มีแพ็คเกจ Brew อยู่
งัด Dolidon

1
ในกรณีของฉันมันเป็นสิ่งที่ฉันต้องการขอบคุณมาก คุณลักษณะที่ยินดีเป็นวิธีที่ง่ายในการประมวลผลแผนผังไดเรกทอรีและเวลาดำเนินการอย่างรวดเร็ว
AlSavi

17

อาจเป็นการดีที่สุดที่จะข้ามไฟล์และโฟลเดอร์ที่ซ่อนอยู่เช่น.git.ดังนั้นแทนที่จะใช้findหากbashรุ่นล่าสุดของคุณเพียงพอหรือหากคุณใช้zshให้ทำดังนี้

dos2unix **

โปรดทราบว่าสำหรับ Bash สิ่งนี้จะต้อง:

shopt -s globstar

.... แต่นี้เป็นคุณสมบัติที่มีประโยชน์พอที่คุณควรจะตรงไปตรงมาเพียงแค่ใส่ไว้ในของคุณ.bashrcอยู่แล้ว

หากคุณไม่ต้องการข้ามไฟล์และโฟลเดอร์ที่ซ่อนอยู่ แต่คุณยังไม่ต้องการยุ่งกับfind(และฉันจะไม่โทษคุณ) คุณสามารถให้อาร์กิวเมนต์ recursive-glob ตัวที่สองเพื่อจับคู่รายการที่ซ่อนอยู่เท่านั้น :

dos2unix ** **/.*

โปรดทราบว่าในทั้งสองกรณี glob จะขยายเพื่อรวมไดเรกทอรีดังนั้นคุณจะเห็นคำเตือนต่อไปนี้ (อาจเกิดขึ้นหลายครั้ง): Skipping <dir>, not a regular file.


1
สิ่งนี้ไม่ได้ผลสำหรับฉัน ไวยากรณ์ globstar ใช้งานได้กับ dos2unix หรือไม่ ฉันใช้ globstar ที่อื่นด้วยความสำเร็จ แต่ไม่สามารถใช้งานได้ ฉันใช้ Bash 4.3.11 (1)
NS du Toit

@NSduToit * เชลล์สไตล์ของ NIX ไม่อนุญาตให้ไฟล์ประมวลผลสามารถปรับเปลี่ยนพฤติกรรมของการขยายอากิวเมนต์ได้เนื่องจาก (ไม่เหมือนกับใน Windows) การขยายอาร์กิวเมนต์จะดำเนินการก่อนที่ไฟล์ปฏิบัติการจะได้รับอาร์กิวเมนต์ ดังนั้นสิ่งเดียวที่ฉันคิดได้ก็คือคุณมีdos2unixนามแฝงบางอย่างที่มีผลต่อการขยายตัวของข้อโต้แย้ง ผลลัพธ์ของtype dos2unixระบบของคุณคืออะไร?
Kyle Strand

1
@ NSToToit มีความสับสนอยู่ที่นี่ คำตอบของฉันระบุอย่างชัดเจนว่าจุดที่ใช้**แทนการfindคือ "ข้ามไฟล์และโฟลเดอร์ที่ซ่อนอยู่เช่น.git" dos2unixไม่เคยเห็นไฟล์ที่ซ่อนอยู่เพราะ**ไม่ขยายเพื่อแสดง หากคุณต้องการที่จะทำงานโดยอัตโนมัติdos2unixในไฟล์ที่ซ่อนอยู่และโฟลเดอร์ที่คุณสามารถใช้findหรือจะขยายตัวเพียงไฟล์ที่ซ่อนและโฟลเดอร์รวมทั้ง(dir ราก), (คน dir หลัก) และรายการอื่น ๆ ที่ซ่อนอยู่ในโฟลเดอร์ปัจจุบัน dos2unix ** **/.***/.*...
Kyle Strand

1
(โปรดทราบว่าdos2unixเพียงพิมพ์Skipping <dir>, not a regular file.เมื่อเรียกใช้ในไดเรกทอรีดังนั้นทำงาน..และ.ปลอดภัย) นอกจากนี้การรวมlsกับ glob ไม่ได้เป็นวิธีที่ดีในการตรวจสอบวิธีการขยายตัวของ glob; ใช้echoแทน: echo **จะพิมพ์ข้อโต้แย้งที่ได้รับจากdos2unix dos2unix **
Kyle Strand

1
ขอบคุณ! มีเหตุผล! โอเคฉันมีความคิดผิด ๆ เกี่ยวกับสิ่งที่**บอกเป็นนัยและการใช้echoทำให้ชัดเจน
NS du Toit

7

กรณีการใช้งานทั่วไปดูเหมือนจะเป็นมาตรฐานการสิ้นสุดบรรทัดสำหรับไฟล์ทั้งหมดที่ส่งไปยังที่เก็บ Git :

git ls-files | xargs dos2unix

โปรดทราบว่าไฟล์บางอย่าง (เช่น*.sln, *.bat) ฯลฯ จะเพียงใช้ในระบบปฏิบัติการ Windows และควรให้CRLFสิ้นสุด:

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

หากจำเป็นให้ใช้ .gitattributes


6

สำหรับผู้ใช้โซลาริส (กำลังใช้ 5.10 อาจใช้ได้กับเวอร์ชันใหม่กว่าเช่นเดียวกับระบบยูนิกซ์อื่น ๆ ):

dos2unix ไม่ได้เป็นค่าเริ่มต้นในการเขียนทับไฟล์มันจะพิมพ์รุ่นที่อัปเดตเป็น stdout ดังนั้นคุณจะต้องระบุแหล่งที่มาและเป้าหมายเช่นชื่อเดียวกันสองครั้ง:

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

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

1
ยินดีต้อนรับสู่ Stack Overflow แม้ว่าโซลูชันของคุณจะเป็นโซลูชันที่ถูกต้อง แต่ก็น่าจะดีถ้าคุณสามารถเพิ่มคำอธิบายลงไปได้ คุณอาจพิจารณาอ้างอิงคำตอบอื่น ๆ เพื่อปรับคำตอบของคุณ โปรดดูที่วิธีการตอบสำหรับข้อมูลเพิ่มเติม
kvantour

2

ฉันมีปัญหาเดียวกันและขอบคุณโพสต์ที่นี่ฉันได้แก้ไขมัน ฉันรู้ว่าฉันมีไฟล์ประมาณร้อยไฟล์และฉันต้องการเรียกใช้สำหรับไฟล์ * .js เท่านั้น find . -type f -name '*.js' -print0 | xargs -0 dos2unix

ขอบคุณทุกท่านสำหรับความช่วยเหลือของคุณ



0

ฉันได้ทำสิ่งนี้เป็นล้านครั้งดังนั้นวิธีการแก้ปัญหาของฉันคือเพียงแค่ใส่ฟังก์ชั่นทุบตีนี้ในสภาพแวดล้อมของคุณ

.bashrcหรือ.profileอะไรก็ตาม

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

การใช้

$ dos2unixd ./somepath

วิธีนี้คุณยังมีคำสั่งเดิมและมันเป็นเรื่องง่ายที่จะจำคนนี้dos2unixdos2unixd


-1

หากไม่มีไดเรกทอรีย่อยคุณสามารถทำได้

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

4
หากไม่มีไดเรกทอรีย่อยdos2unix *จะง่ายกว่าและจริง ๆ แล้วจะแข็งแกร่งกว่านี้ (โดยทั่วไปไม่แนะนำให้ใช้ท่อเอาท์พุตlsเพราะเป็นเครื่องมือการจัดรูปแบบและ*เชื่อถือได้มากขึ้นสำหรับการใช้งานแบบเป็นโปรแกรม)
Kyle Strand

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.