เรียงลำดับผลลัพธ์ของ“ ค้นหา” หรือไม่


77

ฉันต้องสามารถเรียงลำดับเอาต์พุตตามตัวอักษรfindก่อนที่จะไพพ์ไปยังคำสั่ง การเข้า| sort |ระหว่างไม่ทำงานฉันควรทำอย่างไร

find folder1 folder2 -name "*.txt" -print0 | xargs -0 myCommand

คำตอบ:


52

ใช้findตามปกติและคั่นเส้นของคุณด้วย NUL GNU sortสามารถจัดการสิ่งเหล่านี้ได้ด้วยสวิตช์ -z:

find . -print0 | sort -z | xargs -r0 yourcommand

58

บางรุ่นsortมี-zตัวเลือกซึ่งอนุญาตสำหรับการบันทึกที่สิ้นสุดด้วยค่า null

find folder1 folder2 -name "*.txt" -print0 | sort -z | xargs -r0 myCommand

นอกจากนี้คุณยังสามารถเขียนสคริปต์ระดับสูงเพื่อทำ:

find folder1 folder2 -name "*.txt" -print0 | python -c 'import sys; sys.stdout.write("\0".join(sorted(sys.stdin.read().split("\0"))))' | xargs -r0 myCommand

เพิ่ม-rตัวเลือกเพื่อxargsให้แน่ใจว่าmyCommandมีการเรียกพร้อมอาร์กิวเมนต์


ดีหนึ่ง (สองครั้ง) ... น่าสนใจแม้ว่าทั้งสองวิธีจัดการ.แตกต่างกัน ... เมื่อsortมันจบลงในตอนท้ายของรายการ ... โดยpythonเรียงลำดับขึ้นไปด้านบน (อาจจะเป็นภาษาไพ ธ อนLC_COLLATE=C)
Peter.O

นอกจากนี้ยังมี-t \0ตัวเลือกสำหรับการเรียงลำดับ (ซึ่งเป็น-zคำพ้องความหมาย)
Javier

1
ปัญหาเกี่ยวกับ|sortวิธีแก้ไขปัญหาทั้งหมดนี้คือคุณไม่สามารถใช้งาน-execได้อีกต่อไป ตกลงแม้ว่ามันจะเป็นไปได้ที่จะเขียนคำสั่งของคุณเพื่อ-execให้มันทำงานได้xargsแต่คำถามคือ"มินิสคริปต์"คืออะไร? ( sh -c ...) ฉันจะไม่เรียกสิ่งนั้นว่าน่าสนใจในการแปลงมินิสคริปต์ 'sh -c' ที่มีหลายคำสั่งเพื่อให้สามารถทำงานกับxargs(ถ้าเป็นไปได้นั่นคือ)
syntaxerror

@syntaxerror: คุณมีปัญหาอะไรบ้างในการใช้ sh -c กับ xargs printf %s\\n a b c d e | xargs -n3 sh -c 'printf %s, "$@"; printf \\n' x
Roger Pate

4

ฉันคิดว่าคุณต้องการ-nธงสำหรับการเรียงลำดับ #

ตามประเภทคน:

-n, --numeric-sort
    compare according to string numerical value

แก้ไข

print0 อาจมีบางอย่างเกี่ยวกับสิ่งนี้ฉันเพิ่งทดสอบมัน นำ print0 ออกมาคุณสามารถยกเลิกสตริงในการเรียงลำดับโดยใช้-zแฟล็ก


print0ดูเหมือนว่าจะเป็นการแยกช่องว่างชื่อไฟล์ซึ่งเป็นสิ่งที่ฉันต้องส่งต่อคำสั่งของฉันโชคไม่ดี
อุตสาหกรรม

1

หากคุณติดตั้งGNU Parallel http://www.gnu.org/software/parallel/คุณสามารถทำสิ่งนี้ได้:

find folder1 folder2 -name "*.txt" -print | 
  sort |
  parallel myCommand

คุณสามารถติดตั้ง GNU Parallel ได้ง่ายๆโดย:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

ดูวิดีโอแนะนำสำหรับ GNU Parallel เพื่อเรียนรู้เพิ่มเติม: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


อะไรคือเหตุผลสำหรับการใช้ GNU Parallel? เพื่อเพิ่มความเร็วขึ้น?
ปีเตอร์มอร์เทนเซ่น

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