ย้ายไฟล์และโฟลเดอร์ซ้ำ ๆ บน Linux


75

พิจารณา:

ls -al ../public-back
drwxrwxr-x  4 apache   apache     4096 Apr 19 03:32 templates

ls -al ../public-back/templates

drwxrwxr-x  2 apache   apache    4096 Apr 19 03:33 content
drwxrwxr-x  2 apache   apache   20480 Apr 20 06:14 images
drwxrwxr-x  2 apache   apache    4096 Apr 19 03:35 video

ls -al /public

drwxrwxr-x  4 apache   apache     4096 Apr 20 09:49 templates

ls -al /public/templates

drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 content
drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 images
drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 video

ฉันจะย้ายเนื้อหาของการ/public-back/templatesอนุญาตแบบเรียกซ้ำเข้าไปด้วยได้/public/templatesอย่างไร?


mv ../public-back/templates/* พับลิก / แม่แบบ /

mv -R ../public-back/templates/* public/templates/ฉันยังคงลงคะแนนเพื่อย้ายคำถาม

2
mv: ตัวเลือกไม่ถูกต้อง - R @Vladislav Zorov

3
ฉันทำ cp -a ../public-back/templates/ พับลิก /

คำตอบ:


92

นอกจากว่าฉันเข้าใจผิดคำถามนี้จะได้ผล:

mv /public-back/templates/* /public/templates

นอกจากนี้ถ้าคุณมีรายการใหญ่ของไฟล์ที่เพิ่มจะถามก่อนที่จะเขียนทับอะไรที่เพิ่มความปลอดภัยเมื่อใช้สัญลักษณ์เช่น-i*


14
สิ่งนี้จะไม่ย้ายไฟล์ที่ซ่อนอยู่
Arda

2
โปรดดูaskubuntu.com/a/259386/358964สำหรับการตั้งค่า dotglob ดังนั้นไฟล์ที่ซ่อนจะถูกย้ายด้วย
mkobit

3
หมายเหตุ: นี่จะไม่เขียนทับไฟล์ในไดเรกทอรีย่อย คุณจะได้รับDirectory not emptyข้อความ
อาร์มสตรอง

ดูเหมือนว่าจะทำให้ลำดับชั้นไดเรกทอรีเรียบ ไม่ได้เก็บรักษาโฟลเดอร์ไว้ในโฟลเดอร์ดั้งเดิมสำหรับฉัน ไฟล์ทั้งหมดสิ้นสุดในโฟลเดอร์เดียวกันแทนที่จะย้ายโฟลเดอร์ดั้งเดิมด้วยโครงสร้างเดียวกัน
Robert Noack

การแก้ปัญหานี้ทำงาน แต่ถ้าคุณเห็นข้อผิดพลาดนี้: เพียงแค่สร้างโฟลเดอร์ปลายทางด้วยตนเอง:mv: target '/public/templates' is not a directory mkdir /public/templates
Ali Shabdar

8

man page สำหรับ cp states:

-p same as --preserve=mode,ownership,timestamps
-r same as --recursive=copy directories recursively

ลอง;

cp -rp /public-back/templates/* /public/templates/

13
mvสำหรับการย้ายในขณะที่cpสำหรับการคัดลอก - ความแตกต่าง semantical / นิรุกติศาสตร์
Marius Butuc

cpmvเป็นวิธีที่ช้ากว่า cpบังคับให้คอมพิวเตอร์คัดลอกทุกอย่างจากดิสก์ไปยัง RAM แล้วเขียนลงดิสก์อีกครั้งซึ่งอาจใช้เวลานานขึ้นอยู่กับขนาดของไฟล์ อย่างไรก็ตามmvมักจะเกิดขึ้นทันทีเพราะจะต้องมีการเขียนลิงก์ใหม่เท่านั้น
tjespe

4

เมื่อย้ายรายการจาก thumb drive ไปยังระบบ OSMC ฉันพบว่ามีประโยชน์มากดังต่อไปนี้:

find /media/Pi\ Hard\ 16GB/ -name '*' -exec mv -v {} /media/External\ HDD/Videos/ \;

คำอธิบายเกี่ยวกับวิธีการทำงานด้านล่าง

BTW อย่าลืมเพิ่มแบ็กสแลชก่อนช่องว่างใด ๆ ในชื่อไดเรกทอรีต้นทางหรือปลายทาง (ดูด้านบน)

find  finds all files and folders in the destination path.

/media/Pi Hard 16GB/ is the path searched. Escape special char such as spaces.

-name '*' filters on names. If you do not escape or quote this then 
          the shell will expand it before find sees it.

-exec     Executes a command, in our case mv

-v        Verbose, so you can see what's happening (optional)

{}        is replaced by the name of the found object.

อย่างมีประสิทธิภาพคุณกำลังค้นหาไฟล์ทั้งหมดและโฟลเดอร์ทั้งหมดและย้ายไปทีละไฟล์ (หรือหากพบไดเรกทอรีก่อนคุณจะย้ายไดเรกทอรีนั้นและเนื้อหาในนั้น) นี่เป็นการเริ่มกระบวนการใหม่สำหรับการย้ายแต่ละครั้งและไม่มีประสิทธิภาพมาก ใช้สิ่งนี้เฉพาะเมื่อคำสั่งปกติล้มเหลว


2

mv ดูเหมือนจะไม่ทำสิ่งนี้ แต่คุณสามารถใช้เคล็ดลับเล็ก ๆ นี้ทำงานเหมือนมีเสน่ห์:

tar cf - . |(cd /targetdir; tar xvf -)

และรักษาสิทธิ์และทั้งหมด

หมายเหตุ: ไม่มีข้อใดถูกใช้งานได้สำหรับฉันนั่นเป็นสาเหตุที่วิธีแก้ปัญหานี้


1
cp -a --link ../public-back/* /public/.  &&  rm -rf ../public-back

ดังนั้นสร้างฮาร์ดลิงก์ในไดเรกทอรีปลายทางและลบแหล่งที่มา 'mv' จะไม่ทำงานในกรณีของคุณและโดยทั่วไปจะใช้งานได้ก็ต่อเมื่อแหล่งที่มาของ dir และปลายทางไม่มี subtrees ทั่วไป

โปรดทราบว่าฉันสมมติว่าคำว่า 'ย้าย' ในคำถามหมายความว่าแหล่งที่มาควรจะหายไปหลังจากการดำเนินการ

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