ฉันกำลังลองสิ่งนี้อยู่และมันไม่ทำงาน:
ls file_* | xargs mv {} temp/
ความคิดใด ๆ
ฉันกำลังลองสิ่งนี้อยู่และมันไม่ทำงาน:
ls file_* | xargs mv {} temp/
ความคิดใด ๆ
คำตอบ:
บน OS X:
ls file_* | xargs -J {} mv {} temp/
บน Linux:
ls file_* | xargs -i {} mv {} temp/
/
ที่สุดก็เป็นทางเลือก คุณสามารถรวมไว้หากคุณต้องการ แต่ไม่จำเป็น
-i
(หรือ-J
) ระบุโทเค็นที่จะถูกแทนที่ด้วยอาร์กิวเมนต์ที่เข้ามาแทนที่พวกเขาเพียงแค่ถูกตรึงบนปลาย man xargs
-i{}
โดยไม่มีที่ว่าง -I {}
หรือพูด
-i
เป็นเช่นไรมันก็จะถูกแทนที่ ls file_* | xargs -iFOO mv FOO temp/
ทำงานเหมือนกันทุกประการ
find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;
find
ดีกว่าls
ที่อาจมีไฟล์มากกว่าจำนวนอาร์กิวเมนต์ของโปรแกรมที่เชลล์อนุญาต
file_*
ไฟล์ในไดเรกทอรีปัจจุบันในขณะที่find
(ไม่มีตัวเลือกเพิ่มเติม) จะค้นหาทรีไดเรกทอรีทั้งหมดภายใต้ไดเรกทอรีปัจจุบัน
mv
จะไม่สนใจว่าคุณจะประมวลผลไฟล์ด้วยกันหรือแยกกันการใช้งานอื่น ๆ
ใช้ -t "ระบุเป้าหมาย directoty" ที่ mv ควรทำงานการย้ายไฟล์ * ไปยังไดเรกทอรีปลายทาง / temp
เช่น: - #ls -l ไฟล์ * | xargs mv -t / temp
ตามที่แนะนำโดย @ user1953864: { -i
, -J
} ระบุโทเค็นที่จะถูกแทนที่ด้วยอาร์กิวเมนต์ที่เข้ามา
ตัวอย่างเช่นls
:
something.java exampleModel.java NewsQueryImpl.java readme someDirectory/
จากนั้นเพื่อย้ายไฟล์ java ทั้งหมดไปยังโฟลเดอร์ someDirectory ด้วยxargs
จะเป็นดังนี้:
บน Linux
ls *.java | xargs -i mv {} someDirectory/
บน MacOS
ls *.java | xargs -J mv {} someDirectory
วิธีแก้ไขอื่นอาจเป็น:
for f in file_* ; do
mv $f temp/$f
done
ข้อเสียคือมันเป็นmv
กระบวนการใหม่สำหรับแต่ละไฟล์
xargs -n10
ตัวอย่าง)