ย้ายไฟล์ด้วย find + xargs: เป้าหมายไม่ใช่ไดเรกทอรีใช่หรือไม่


9

เมื่อฉันเรียกใช้คำสั่งต่อไปนี้:

> mkdir some_dir
> find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} some_dir

ฉันได้รับหลายร้อยบรรทัดที่พูดว่า:

mv: target `/foo/bar/XX.csv` is not a directory

ทำไม? ฉันคิดว่า xargs จะทำงาน:

mv /foo/barXX.csv some_dir

สำหรับทุกไฟล์ที่findพบ เกิดอะไรขึ้น? โดยวิธีนี้เป็นกับ zsh

ปรับปรุง:

Update1:

ฉันเหนื่อย:

find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} -t some_dir

แต่ฉันก็มีสองสามบรรทัดเช่น:

mv: cannot stat `{}': No such file or directory

แม้ว่าฉันคิดว่าคำสั่งจะย้ายไฟล์ของฉันอย่างถูกต้อง

Update2:

ฉันไม่ต้องการ-tตัวเลือกเมื่อใช้mvคนเดียว ตัวอย่างเช่น

> touch file1.txt
> touch file2.txt
> mkdir my_dir
> mv  file1.txt  file2.txt  my_dir

ทำได้ดี. ทำไมฉันต้อง-tใช้เมื่อใช้xargs?

คำตอบ:


14

สมมติว่าคุณมี GNU ( find,, xargs& mv), เปลี่ยนคำสั่งของคุณเป็น:

$ find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir

ตัดตอนมาจากmvหน้าคน

   -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY

ด้านบนxargs ...จะสร้างคำสั่งเพื่อให้การโทรเพื่อย้ายเป็นดังนี้:

 $ mv 1.csv 2.csv 3.csv ... -t some_dir

ไม่ต้องการ xargs

คุณสามารถข้ามวิธีนี้โดยเพียงแค่findทำทุกอย่างเอง:

$ find /foot/bar/ -name '*.csv' -exec mv -t some_dir {} +

ทำไมคุณต้องการmv -t ...?

สิ่งนี้เกี่ยวข้องกับวิธีการxargsสร้างชุดของไฟล์ที่จะส่งผ่านไปยังคำสั่งที่มันจะรันในแต่ละครั้ง (เช่นmv ...)

เมื่อคุณเรียกใช้mvคำสั่งด้วยตนเองคุณจะสามารถควบคุมจำนวนไฟล์ที่ส่งผ่านไปได้และคุณไม่จำเป็นต้องกังวลเกี่ยวกับการต้องการ-t my_dirเนื่องจากคุณจะทำให้ไดเรกทอรีปลายทางอยู่เสมอ

อ้างอิง


ขอบคุณ! สิ่งนี้มีประโยชน์มาก ฉันสับสนเล็กน้อย (ดูอัปเดตของฉัน)
Amelio Vazquez-Reina

1
คำสั่งที่สร้างขึ้นmv -t some_dir 1.csv 2.csv 3.csv ...เพื่อให้อาร์กิวเมนต์ไฟล์เป็นครั้งสุดท้าย นั่นเป็นข้อผิดพลาดในคำถามในเพื่อที่จะใช้{}ต้องผ่านการ-I {} xargs
frostschutz

ขอบคุณ นั่นอธิบายทุกอย่าง เกี่ยวกับคำถามที่สองที่ฉันมีใน Update 2 คุณรู้หรือไม่ว่าทำไมฉันถึงไม่ต้องการ-tไฟล์หลาย ๆ ไฟล์และไดเร็กตอรี่ที่มีปกติmv?
Amelio Vazquez-Reina

1
@ user815423426 - ฉันจะอัปเดตในภายหลังเมื่อฉันได้รับโอกาสคืนนี้ฉันรู้ว่าทำไม
slm

@ user815423426 - ฉันอัปเดตคำถามแจ้งให้เราทราบหากมันสมเหตุสมผลmv -tแล้ว
slm

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