ค้นหาความขัดแย้งในการเรียงลำดับ + -printf +?


0

ฉันต้องผ่านรายการเรียงลำดับชื่อไฟล์ FLAC ที่ยกมาให้ SoX สำหรับการต่อข้อมูล แต่ฉันมีปัญหาในการเรียงลำดับเพื่อทำงานตามที่ฉันคาดหวัง

ถ้าฉันใช้:

find . -maxdepth 1 -type f -iname "*.flac" | sort

ฉันได้สิ่งที่ฉันคาดหวัง:

./01-Lordy.flac
./02-Both Sides Now.flac
./03-Solitary Man.flac
./04-Holly Holy.flac
./05-Cherry Cherry.flac
./06-Kentucky Woman.flac
./07-Sweet Caroline.flac
./08-Thank the Lord for the Nightime.flac
./09-And the Singer Sings His Song.flac
./10-Brother Loves Traveling Salvation Show.flac

อย่างไรก็ตามฉันไม่สามารถใช้สิ่งนั้นกับสิ่งที่ฉันทำเพราะฉันต้องการรายชื่อที่เสนอโดยไม่มีบรรทัดใหม่ ฉันรู้ว่า - printf สามารถทำสิ่งนี้ให้ฉันได้ แต่เมื่อฉันลอง:

find . -maxdepth 1 -type f -iname "*.FlAc" -printf "\"%p\" " | sort

ฉันจบลงด้วยรายการชื่อไฟล์ที่ยกมาและคั่นด้วยช่องว่างเดียว (ดี!) แต่พวกเขาไม่ได้เรียงลำดับ (แย่มาก!) หรืออย่างน้อยพวกเขาก็ไม่ได้เรียงอย่างที่ฉันคาดไว้:

"./08-Thank the Lord for the Nightime.flac" "./03-Solitary Man.flac" "./09-And the Singer Sings His Song.flac" "./05-Cherry Cherry.flac" "./06-Kentucky Woman.flac" "./10-Brother Loves Traveling Salvation Show.flac" "./07-Sweet Caroline.flac" "./02-Both Sides Now.flac" "./01-Lordy.flac" "./04-Holly Holy.flac"

อาจจะแปลกกว่านี้ถ้าฉันแค่ทดสอบเพื่อใช้รหัสเดียวกัน แต่เพิ่มขึ้นบรรทัดใหม่:

find . -maxdepth 1 -type f -iname "*.FlAc" -printf "\"%p\" "\\n | sort

การเรียงลำดับใช้งานได้แม้ว่าเอาต์พุตจะไม่เป็นสิ่งที่ฉันต้องการ:

"./01-Lordy.flac" 
"./02-Both Sides Now.flac" 
"./03-Solitary Man.flac" 
"./04-Holly Holy.flac" 
"./05-Cherry Cherry.flac" 
"./06-Kentucky Woman.flac" 
"./07-Sweet Caroline.flac" 
"./08-Thank the Lord for the Nightime.flac" 
"./09-And the Singer Sings His Song.flac" 
"./10-Brother Loves Traveling Salvation Show.flac"

นี่คือภายใต้ Ubuntu 18.04.1


คุณต้องใช้findที่นี่เพื่อการสอบถามซ้ำหรือไม่? หรือไฟล์ทั้งหมดที่ต้องการในไดเรกทอรีเดียวกันคืออะไร? (ฉันถามกำหนด-maxdepth 1และตัวอย่างผลลัพธ์ที่แสดงไดเรกทอรีเดียวกัน)
Jeff Schaller

1
ฉันคิดว่าสิ่งที่คุณมองเห็นคือsortเรียงลำดับบรรทัด (หรือด้วย GNU sort -zองค์ประกอบที่คั่นด้วย null) - ไม่น่าแปลกใจเลยที่จะไม่เรียงชื่อไฟล์เมื่อพวกเขาอยู่ในบรรทัดเดียว
steeldriver

2
หากคุณก) ใช้ GNU sed และ b) คุณต้องการค้นหาไฟล์ของคุณซ้ำ ๆ คุณสามารถใช้สิ่งนี้find . -iname '*.flac' -print0 | sort -z | xargs -0 sox ...แทนการทำ messing กับ quoting และ unquoting
mosvy

@mosvy ฉันเพิ่งทดสอบความคิดนั้น นั่นดูเหมือนจะเป็นคำตอบเพิ่มเติมที่ดี!
Jeff Schaller

หากคุณกำลังพยายามรวบรวมชื่อไฟล์เพื่อส่งไปยัง SoX เป็นอาร์กิวเมนต์บรรทัดคำสั่งคุณไม่ต้องการใส่เครื่องหมายคำพูดล้อมรอบพวกเขา เครื่องหมายคำพูดจะแยกเฉพาะเมื่อพวกเขาเป็นส่วนหนึ่งของคำสั่งไม่ใช่ในวันที่ (เช่นจากการเปลี่ยนตัวแปรหรือคำสั่ง) ดูที่นี่สำหรับตัวอย่าง
Gordon Davisson

คำตอบ:


3

หากไฟล์ทั้งหมดอยู่ในไดเรกทอรีเดียวกันและคุณต้องการส่งรายการชื่อไฟล์ที่เรียงลำดับไปsoxแล้ว bash shell สามารถทำได้โดยตรง:

shopt -s nocaseglob
sox *.flac

nocaseglobตัวเลือกเปลือกช่วยให้ตัวแทนไปรับ foo.FLAC, foo.Flac, foo.flaC ฯลฯ สัญลักษณ์ตัวแทนขยายไปยังรายชื่อเรียงตามตัวอักษรเหมือนเปลือยsortจะ มันจะยกตัวอย่างเช่นใส่9-file.flacหลังชื่อไฟล์ใด ๆ 8ที่เริ่มต้นด้วย

ขอบคุณ @mosvy สำหรับการทำให้ bash-ism ด้านบนเป็น wildcard ที่ควรใช้กับเชลล์ใด ๆ :

sox *.[Ff][Ll][Aa][Cc]

วงเล็บอนุญาตให้ใช้ตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็กในส่วนขยาย "flac" เพื่อให้ตรงกับสิ่งที่คุณfind ... -iname "*.FlAc"ทำ


2
ไม่จำเป็นต้องnocaseglob; sox *.[fF][lL][aA][cC]จะทำอะไรได้ดีในทุก ๆ เชลล์
mosvy

ขอบคุณทุกคน. sox *.[fF][lL][aA][cC]ดูเหมือนว่ามันจะทำงานได้ในขณะที่printf '%s\n' *.[Ff][Ll][Aa][Cc]ดูเหมือนว่าจะให้สิ่งที่ฉันต้องตรวจสอบอีกครั้งว่าคำสั่งซื้อนั้นถูกต้อง
ความโหดร้าย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.