Score:8

เกิดข้อผิดพลาดเมื่อพยายาม mv ไฟล์ที่มี -r ในชื่อไฟล์

ธง in

นี่คือปัญหาของฉัน:

ฉันมีไฟล์ที่มี -r ในชื่อ: -r.jpg

เมื่อฉันพยายามทำ mv *.jpg เก่า/ ฉันเข้าใจ:

mv: ตัวเลือกที่ไม่ถูกต้อง -- 'r'

แม้สำหรับ

สำหรับ g ใน *.jpg;ทำ echo $g &&mv "${g}" old/;done

ฉันมีข้อผิดพลาดเดียวกัน

paladin avatar
id flag
ใช้ `mv -- *.jpg old/`, `--` ปิดใช้งาน "พารามิเตอร์" เพิ่มเติมทั้งหมดหลังจาก `--`
pl flag
เป็นเรื่องดีที่คุณไม่ได้พยายาม `rm` ไฟล์ที่มี `-rf` ...
Score:16
ธง kz

ยูทิลิตี้บรรทัดคำสั่งส่วนใหญ่มีข้อกำหนดในการแยก ตัวเลือก จาก ข้อโต้แย้ง.

ที่ป้องกันปัญหามากมายกับ "พิเศษ" ชื่อไฟล์ที่ดูเหมือนตัวเลือก

ตัวคั่นที่ใช้บ่อยที่สุดบ่งชี้จุดสิ้นสุดของตัวเลือกคือยัติภังค์สองตัว -- หรือ -- ซึ่งได้รับการสนับสนุนจาก เอ็มวี.

กล่าวอีกนัยหนึ่ง:

 mv [ตัวเลือก] -- ปลายทางแหล่งที่มา

หรือเนื่องจากคุณไม่ได้ระบุตัวเลือกใดๆ:

 mv -- *.jpg เก่า/
Score:2
ธง cn

ทางออกที่ง่ายที่สุดคือการต่อท้ายชื่อไฟล์ด้วย ./ อธิบายเส้นทางสัมพัทธ์

สำหรับ g ใน *.jpg; ทำ echo $g && mv "./${g}" old/; เสร็จแล้ว

นอกจากนี้ยังสามารถใช้เส้นทางสัมบูรณ์

สำหรับ g ใน $(pwd)/*.jpg; ทำ echo $g && mv $g old/; เสร็จแล้ว

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

สำหรับ g ใน $(find . -name "*jpg"); ทำ mv $g เก่า; เสร็จแล้ว

และในกรณีที่เลวร้ายที่สุดที่คุณมีอักขระที่ไม่สามารถแยกวิเคราะห์ที่ซับซ้อนจำนวนมาก คุณสามารถอ้างถึงหมายเลขไอโหนดรวมกับ ค้นหา -inum และประมวลผลไฟล์ของคุณตามนั้น

 $ สำหรับ g ใน $(ls -i1 ./*jpg | ตัด -f1 -d' '); หา . -inum $g -พิมพ์0 | xargs -0 -I '{}' mv '{}' เก่า; เสร็จแล้ว
in flag
การใช้ "./" เป็นคำใบ้ที่ชาญฉลาด ; และ inum บอกใบ้เป็นทางออกที่ดีมาก :)
iBug avatar
um flag
ไม่มีอักขระที่ "แยกวิเคราะห์ไม่ได้" อย่างแท้จริง: สิ่งที่คุณต้องทำคืออ้างอิงตัวแปรอย่างถูกต้อง ในกรณีส่วนใหญ่ เครื่องหมายคำพูดคู่ก็เพียงพอแล้ว
Peter Cordes avatar
ke flag
`mv ./*.jpg old/` จะทำงาน; คุณไม่จำเป็นต้องวนซ้ำทีละไฟล์
Peter Cordes avatar
ke flag
@Bussiere: แฮ็ค `find -inum` นั้นไม่มีประโยชน์อย่างยิ่งเว้นแต่คุณจะต้องการค้นหาฮาร์ดลิงก์ `หา. -maxความลึก 1 -ชื่อ '*.jpg' -print0 | xargs -0 mv -t old/` หรืออะไรทำนองนั้นจะทำสิ่งเดียวกันและในที่สุดก็รัน `mv -t old ./-r.jpg` เช่นคำสั่งนี้ (อาจมีชื่อไฟล์อื่นหลายชื่อในบรรทัดคำสั่งเดียวกัน) มันเสียเวลามากในการเริ่ม 'ค้นหา' เพื่อสแกนทรีย่อยทั้งหมดสำหรับไฟล์ที่มีหมายเลขไอโหนดนั้นสำหรับแต่ละไฟล์อินพุต จากนั้นจึงพิมพ์ชื่อไฟล์ มัน *ไม่* รัน `mv` บนหมายเลขไอโหนด การเรียกระบบ Unix ไม่สามารถทำได้
Peter Cordes avatar
ke flag
@Bussiere: สิ่งสำคัญที่ทำให้มันใช้งานได้ (`./*.jpg` แทนที่จะเป็น `*.jpg`) ถูกใช้ไปแล้วในบรรทัดคำสั่ง `ls` เพื่อหลีกเลี่ยงการเรียกใช้ `ls -r.jpg` ส่วนที่เหลือคือ เสียแรงเปล่าไปเปล่าๆ ฉันไม่สามารถนึกภาพกรณีที่การ find ค้นหาหมายเลขไอโหนดนั้นดีกว่าแค่ใช้การจับคู่ชื่อไฟล์ของ find เช่น `-iname` หรือ `-path` และใช้ `-exec mv -t old/ {} +` เพื่อหลีกเลี่ยงแม้แต่การต้องการ xargs

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา