ฉันจะย้ายไฟล์ที่มี xargs บน Linux ได้อย่างไร


24

ฉันกำลังลองสิ่งนี้อยู่และมันไม่ทำงาน:

ls file_* | xargs mv {} temp/

ความคิดใด ๆ


ทุกคนที่มีเวอร์ชันย้ายหลายไฟล์หรือไม่ ( xargs -n10ตัวอย่าง)
Gert van den Berg

คำตอบ:


31

บน OS X:

ls file_* | xargs -J {} mv {} temp/

บน Linux:

ls file_* | xargs -i {} mv {} temp/

1
อย่างน้อย/ที่สุดก็เป็นทางเลือก คุณสามารถรวมไว้หากคุณต้องการ แต่ไม่จำเป็น
สกอตต์

4
@ user1953864: -i(หรือ-J) ระบุโทเค็นที่จะถูกแทนที่ด้วยอาร์กิวเมนต์ที่เข้ามาแทนที่พวกเขาเพียงแค่ถูกตรึงบนปลาย man xargs
Amadan

14
คุณอาจจำเป็นต้องพูด-i{}โดยไม่มีที่ว่าง -I {}หรือพูด
สกอตต์

1
ฉันสังเกตเห็นว่าการใช้ "%" แทน "{}" ก็ใช้ได้เช่นกัน -% หมายความว่าอะไรและ {} หมายถึงอะไร ตัวอย่าง: ls file_ * | xargs -I% mv% temp /
dmonopoly

3
@dmonopoly: พวกเขาไม่ได้มีความหมายอะไรเลย ไม่ว่าพารามิเตอร์จะ-iเป็นเช่นไรมันก็จะถูกแทนที่ ls file_* | xargs -iFOO mv FOO temp/ทำงานเหมือนกันทุกประการ
Amadan

8

find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;

findดีกว่าlsที่อาจมีไฟล์มากกว่าจำนวนอาร์กิวเมนต์ของโปรแกรมที่เชลล์อนุญาต


2
โปรดทราบว่าคำถามนี้แสดงถึงความปรารถนาที่จะประมวลผลเฉพาะfile_*ไฟล์ในไดเรกทอรีปัจจุบันในขณะที่find(ไม่มีตัวเลือกเพิ่มเติม) จะค้นหาทรีไดเรกทอรีทั้งหมดภายใต้ไดเรกทอรีปัจจุบัน
สกอตต์

1
ใช่จริง เพิ่ม-maxdepth 0เพื่อป้องกันสิ่งนี้

"ดีกว่า" เป็นอัตนัย มีประสิทธิภาพยิ่งขึ้นซับซ้อนขึ้นและช้าลง; และแม้ว่าmvจะไม่สนใจว่าคุณจะประมวลผลไฟล์ด้วยกันหรือแยกกันการใช้งานอื่น ๆ
Amadan

แก้ไข (เพิ่ม-maxdepth 0)

8

ใช้ -t "ระบุเป้าหมาย directoty" ที่ mv ควรทำงานการย้ายไฟล์ * ไปยังไดเรกทอรีปลายทาง / temp

เช่น: - #ls -l ไฟล์ * | xargs mv -t / temp


4

ตามที่แนะนำโดย @ 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

0

วิธีแก้ไขอื่นอาจเป็น:

 for f in file_* ; do
   mv $f temp/$f
 done

ข้อเสียคือมันเป็นmvกระบวนการใหม่สำหรับแต่ละไฟล์

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