ไฟล์ mv พร้อม | xargs


18

ฉันแค่พยายามย้ายไฟล์หลายไฟล์ (ไม่ใช่ symlink) ออกจากโฟลเดอร์ / etc / apache / sites-enabled ของฉันไปยังโฟลเดอร์ / etc / apache / sites-available ดังต่อไปนี้:

/etc/apache2/sites-enabled$ find . -maxdepth 1 -type f | xargs mv {} ../sites-available/

แต่ฉันเป็นอูบุนตู n00b และฉันได้รับข้อผิดพลาดนี้:

mv: target `./real-file' is not a directory

โดยที่ 'ไฟล์จริง' เป็นไฟล์ทดสอบที่ฉันได้ตั้งค่าไว้ในสภาพแวดล้อมการพัฒนาของฉัน ฉันพยายามจัดระเบียบคนอื่นบนเซิร์ฟเวอร์การผลิต ;-)

คำตอบ:


27

คุณสามารถลอง-execตัวเลือกด้วยfindคำสั่ง

/etc/apache2/sites-enabled$ sudo find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \;

สำหรับการย้ายไฟล์โดย root คุณต้องsudoได้รับอนุญาต

หากคุณต้องการใช้xargsคำสั่งให้เพิ่ม-Iตัวเลือกลงไป

find . -maxdepth 1 -type f | sudo xargs -I {} mv {} /etc/apache2/sites-available/

7

เป็นการดีที่คุณควรใช้ -print0 กับ find ดังนั้นชื่อไฟล์ที่มีช่องว่างจะไม่ทำให้เกิดปัญหา

เช่นนี้ควรใช้งานได้:

find . -whatever-flags-go-here -print0 | xargs -r0 mv -t target-directory

0

คุณสามารถใช้วิธีอื่นเพื่อทำสิ่งเดียวกัน แต่มีประสิทธิภาพเพิ่มเติม :

find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \+

โปรดทราบว่ามันลงท้ายด้วย\+ซึ่งหมายความว่าคำสั่ง find จะได้รับผลลัพธ์และขยายไปสู่{}การทำสิ่งที่คุณต้องการด้วยวิธีนี้คุณหลีกเลี่ยงสองตัวเลือก ( \;= สำหรับแต่ละรายการและการไพพ์ลงในคำสั่งใหม่xargs)

นี่คือคำอธิบาย (คุณสามารถตรวจสอบคู่มือman find)

คำสั่ง -exec {} + ตัวแปรของการดำเนินการ -exec นี้รันคำสั่งที่ระบุในไฟล์ที่เลือก แต่บรรทัดคำสั่งจะถูกสร้างโดยการต่อท้ายชื่อไฟล์ที่เลือกแต่ละชื่อที่ท้าย จำนวนการร้องขอคำสั่งทั้งหมดจะน้อยกว่าจำนวนไฟล์ที่ตรงกัน บรรทัดคำสั่งสร้างขึ้นในลักษณะเดียวกับที่ xargs สร้างบรรทัดคำสั่ง อนุญาตเพียงหนึ่งอินสแตนซ์ของ '{}' ภายในคำสั่ง คำสั่งจะถูกดำเนินการในไดเรกทอรีเริ่มต้น

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