ย้ายไฟล์ตามรายการในไฟล์ (พร้อมช่องว่างนำหน้า)


12

ฉันมีไฟล์ที่มีชื่อไฟล์ ตัวอย่างเช่น:

/tmp/list.txt (ขึ้นอยู่กับช่องว่างที่จุดเริ่มต้นของแต่ละบรรทัด):

  /tmp/file.log
  /app/nir/home.txt
  /etc/config.cust

ฉันต้องการใช้หนึ่งบรรทัดเพื่อย้ายไฟล์ทั้งหมดที่ระบุไว้/tmp/list.txtไปยัง/app/dest

ดังนั้นควรเป็นดังนี้:

cat /tmp/list.txt | xargs mv /app/dest/

คำตอบ:


21

คุณไม่มี-tตัวเลือกสำหรับmv(สมมติว่า GNU mv):

cat /tmp/list.txt | xargs mv -t /app/dest/

หรือสั้นกว่า (ได้รับแรงบันดาลใจจากคำตอบของ X Tian):

xargs mv -t /app/dest/ < /tmp/list.txt

ช่องว่างนำหน้า (และท้ายสุด) จะถูกลบออก ช่องว่างภายในชื่อไฟล์จะนำไปสู่ปัญหา

หากคุณมีช่องว่างหรือแท็บหรือเครื่องหมายคำพูดหรือแบ็กสแลชในชื่อไฟล์สมมติว่า GNU xargsคุณสามารถใช้:

sed 's/^ *//' < /tmp/list.txt | xargs -d '\n' mv -t /app/dest/

ขอบคุณสำหรับคำตอบ ด้วยวิธีนี้ฉันสามารถสร้างรายการไฟล์จำนวนมากด้วย [!] ในชื่อของพวกเขาและย้ายไปยังโฟลเดอร์อื่นโดยมีสิ่งต่อไปนี้: ls | grep -e ". [!]]" | tee 001.txt; sed 's / ^ * //' <001.txt | xargs -d '\ n' mv -t / destinypath /
inukaze

6

สมมติว่าชื่อไฟล์ของคุณค่อนข้างมีเหตุผล (ไม่มีบรรทัดใหม่หรืออักขระแปลก ๆ ):

while read file; do mv "$file" /app/dest/; done < list.txt 

วิธีจัดการกับชื่อไฟล์แปลก ๆ (แตกถ้าชื่อไฟล์มีการขึ้นบรรทัดใหม่):

while IFS= read -r file; do mv "$file" /app/dest/; done < list.txt 

สวัสดี terdon, วิธีย้ายโฟลเดอร์ไปยังไดเรคทอรีใหม่โดยอ้างอิงจากไฟล์ที่ตรงกันในไฟล์ csv? ได้โปรดช่วยฉันด้วย [ unix.stackexchange.com/questions/433068/…ขอบคุณ !!
user3351523

@ user3351523 คำถามของคุณถูกปิด การขอความช่วยเหลือจากคนอื่นจะไม่เปลี่ยนแปลง ให้แก้ไขคำถามแทนและอธิบายว่าวิธีแก้ปัญหาในรายการซ้ำไม่ช่วยคุณได้อย่างไร หากสิ่งที่ "ไม่ทำงาน" ให้อธิบายว่าล้มเหลวอย่างไร วิธีแก้ปัญหาควรได้ผลสำหรับคุณดังนั้นคุณต้องอธิบายว่าเกิดอะไรขึ้นเมื่อคุณลองใช้
terdon

ฉันทำมัน. คุณสามารถดูได้
user3351523

@ user3351523 คุณยังไม่ได้อธิบายว่าทำไมการแก้ปัญหาของ dupe จึงล้มเหลวสำหรับคุณ และคุณยังไม่ได้อธิบายว่าคำตอบของคุณล้มเหลวอย่างไร คุณอาจต้องใช้cp -Hrแต่ฉันไม่รู้ว่า OSX cpรองรับหรือไม่
terdon


1

xargs ล้วนอ่านโดยตรงจากไฟล์

xargs -l -i < flist  mv -v {} /app/dst

แก้ไข 1 - หลังจากความคิดเห็นของ @Anthon ด้านล่าง

xargs -I{} < flist  mv -v {} /app/dst

1
-iเป็น deprecrated และมันหรือมันทดแทน -i เปรย/-l --max-lines=1และทำให้เกิดmvการดำเนินการสำหรับแต่ละไฟล์แยกกัน
Anthon

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