พยายามเข้าใจ xargs


4

เป้าหมายไม่ได้อยู่ในรายการtemp/run*.*ไฟล์ เป้าหมายคือการเข้าใจว่าทำไมคำสั่งที่สองไม่ทำงาน

คำสั่งแรก:

find . \( -name 'temp' \) -print0 | xargs -0 -L 1 -I datafind ls -ltr datafind

แสดงรายการไฟล์ทั้งหมดที่อยู่ในโฟลเดอร์ temp จากไดเรกทอรีจริง

คำสั่งที่สอง:

find . \( -name 'temp' \) -print0 | xargs -0 -L 1 -I datafind ls -ltr datafind/run*.*

ให้ไม่สามารถเข้าถึงข้อผิดพลาดในทุกไดเรกทอรีที่ทำงานกับคำสั่งก่อนหน้า

ฉันค้นหาและอ่าน man man และตัวอย่าง แต่ฉันไม่สามารถหาสาเหตุที่คำสั่งที่สองไม่ทำงาน มีเบาะแสอะไรมั้ย


ไม่ได้ถาม แต่ทำไมไม่กรองตามเวลา? find . ! \( -name 'run*' \) -print
Hennes

เนื่องจากมีไฟล์ 'run *' อื่น ๆ ในโฟลเดอร์อื่นฉันไม่ต้องการเห็น และโปรดเป้าหมายคือเข้าใจว่าทำไมคำสั่งที่สองไม่ทำงาน
เซ่

คำตอบ:


4

ความสับสนคืออักขระไวด์การ์ดเช่น*และ*.*ประเมินโดยเชลล์เมื่อคุณพิมพ์คำสั่ง

ดังนั้นdatafind/run*.*จะถูกประเมินโดยเชลล์และจะถูกแทนที่ด้วยชื่อไฟล์ที่ตรงกับที่นั้น แต่ไม่พบไฟล์ใด ๆ ที่ตรงกัน ดังนั้นdatafind/run*.*ถูกกำหนดให้กับxargsคำสั่งและจากนั้นจะส่งผ่านสิทธิ์นั้นไปยังlsคำสั่ง

lsคำสั่งไม่เข้าใจอักขระตัวแทนจึงใช้เวลาเพียงป้อนข้อมูลและพยายามที่จะหาแฟ้มที่มีชื่อว่า ไม่มีไฟล์ที่มีชื่อrun*.*ดังนั้นคุณจะได้รับข้อผิดพลาดไม่มีไฟล์หรือไดเรกทอรีดังกล่าว


Ohhh คุณหมายถึง ls work พิมพ์เฉพาะข้อมูลที่เชลล์รวบรวมหรือไม่ ไม่เคยสงสัยเลยว่ามันจะตรงกับผลลัพธ์ :) ขอบคุณมาก
เซ่

1
หา (-name 'temp') -print0 | xargs -0 -L 1 -I datafind sh -c "ls -ltr datafind / run *. *" สมบูรณ์แบบ ขอบคุณมากอีกครั้ง
เซ่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.