mv: ไดเรกทอรีไม่ว่างเปล่า


155

ฉันต้องการย้ายเนื้อหาของไดเรกทอรีภายในไดเรกทอรีอื่นด้วยโฟลเดอร์เดียวกัน

นี่คือตัวอย่าง:

ผมได้./backupชมีไดเรกทอรีและbase testตอนนี้ฉันต้องการย้ายไดเรกทอรีเหล่านี้./backupArchivesมา

ฉันใช้สิ่งนี้:

mv ./backup/* ./backupArchives

แต่ฉันได้รับข้อผิดพลาด

mv: cannot move './backup/base' to './backupsArchive/base': Directory not empty

ฉันพยายามใช้--forceแต่ไม่มีโชค มีวิธีการย้ายเมื่อโฟลเดอร์มีอยู่แล้ว?

หมายเหตุ: ฉันต้องการรวมเนื้อหาโดยไม่มีการเขียนทับ


คุณเพียงแค่พยายามที่จะรวมเนื้อหาของโฟลเดอร์เข้ากับปลายทางหรือคุณพยายามที่จะเขียนทับสิ่งที่อยู่ในปลายทาง (นอกจากนี้ยังช่วยถ้าคุณมีข้อผิดพลาดทั้งหมดโดยไม่ต้องใช้ ...... เพื่อตัดทอนข้อมูล)
Thomas Ward

ฉันแค่ต้องการรวมเนื้อหาไม่มีการเขียนทับ
UdK

2
@UdK แม้ว่าจะใช้งานได้โปรดทราบว่านี่จะไม่รวมเนื้อหาของสองไดเรกทอรี การย้ายไดเรกทอรีจะแทนที่เป้าหมาย ลองดูที่rsyncมันจะทำการรวมกัน
zwets

คำตอบ:


188

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

ใช้rsync -a backup/ backupArchives/แทน rm -rf backup/*ต่อจากนั้น

แทนที่จะใช้rsyncคุณสามารถทำคลาสสิก

(cd backup && tar c .) | (cd backupArchives && tar xf -)

ซึ่งทำให้คุณได้รับคะแนนเกินบรรยายมากขึ้น


4
สิ่งที่น่ารู้! ทั้งสองทำงานได้ดี ขอขอบคุณ!
UdK

5
คะแนน Geek เป็นคะแนนที่ดีที่สุด: D
MadMike

2
ควรสังเกตว่าคุณต้องมีขนาดของโฟลเดอร์ในพื้นที่ว่าง และจะทำให้เกิดปัญหาที่น่ากลัวถ้าไม่
Pogrindis

4
@Pogrindis โปรดอธิบายปัญหาที่น่ากลัวที่จะเกิดขึ้นและความแตกต่างของความพยายามอื่น ๆ ในการเขียนไปยังดิสก์เต็มรูปแบบคืออะไร? อันที่จริงเนื่องจากการดำเนินการทั้งสองเก็บไดเรกทอรีเดิมไว้เหมือนเดิมหากการดำเนินการล้มเหลวคุณเพียงแค่rm -rf backupArchivesไม่มีผลที่ตามมา
zwets

4
ขอบคุณสำหรับการตั้งชื่อวิธีการแบบคลาสสิกมีประโยชน์มากถ้า rsync ไม่พร้อมใช้งาน! ใช้ได้กับ sudo โดยใช้sudo sh -c '(cd backup && tar c .) | (cd backupArchives && tar xf -)'
ArendE

39

รวดเร็วและสกปรกถ้าคุณรู้ว่าคุณกำลังทำอะไรอยู่:

cp -r ./backup/* ./backupArchives && rm -R ./backup/*

3
ยังทำงานในเซฟโหมดของฉันด้วย
Banned_User

4

หลังจากไดเรกทอรีที่คุณย้ายคุณต้องการ*(หมายถึงข้อความหรือหมายเลขใด ๆ ) ตัวอย่างเช่น:

mv /var/www/* /recovery/wwwrecovery/

นั่นคือทั้งหมดถ้าคุณย้ายไฟล์มากกว่าที่คุณจะย้ายเป็น:

mv /var/www/index.php /recovery/index.php

อีกวิธีหนึ่งคือการแพ็คเนื้อหาของโฟลเดอร์นั้นโดยใช้ tar:

tar -cvzpf backup.tar.gz /var/www 

จากนั้นย้ายไฟล์นั้นไปวางเป็นไฟล์อื่น นอกจากนี้ฉันขอแนะนำขั้นตอนนี้เนื่องจาก tar บีบอัดและทำให้มีขนาดเล็กลง

เพื่อแยกไฟล์ไปยังโฟลเดอร์อื่นใช้

tar -xvzpf /var/www/

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

sudo tar -cvzpf backup.tar.gz /var/www/

ฉันใช้ Ubuntu 12.10 และได้รับ: mv: ตัวเลือกที่ไม่ถูกต้อง - 'R' ลอง `mv - ช่วย 'สำหรับข้อมูลเพิ่มเติม แน่นอน. tar เป็นสิ่งที่ดี แต่ฉันจำเป็นต้องรู้วิธีการย้ายไฟล์ของฉันสำหรับสถานการณ์นี้ ขอบคุณสำหรับความช่วยเหลือของคุณ
UdK

ฉันใช้เดสก์ท็อปและเซิร์ฟเวอร์ 12.04 และทั้งคู่ทำงานได้ดี ระวังถ้าคุณไม่ได้ทำพื้นที่ระหว่างคนและ -R ฉันยังลองโดยไม่ใช้ -R ทำงานในลักษณะเดียวกันกับฉันลองโดยไม่ใช้ -R แต่ระวังการสะกดคำ: linux สำคัญต่อตัวอักษรตัวเล็กและตัวใหญ่ !!! กว่าถ้าเส้นทางรวมอยู่ในการย้ายหรือย้ายจากตำแหน่ง หากคุณไม่มีโฟลเดอร์ที่คุณต้องการย้ายไปใส่เพียง -C หลังจากนั้นและมันจะสร้างมันขึ้นมา ลองก่อน: ค้นหาชื่อ - ชื่อโฟลเดอร์ของคุณ และเรียกใช้คำสั่งนี้จากรูทเพื่อดูว่ามีอยู่ในที่อื่นหรือไม่หากคุณสะกดคำผิด ให้ฉันคำสั่งที่แน่นอนที่คุณใช้
Dimitris Theodoridis

สิ่งที่ thaaa ..... ใส่ชื่อไฟล์นั้นใน betwen **
Dimitris Theodoridis

1
นั่น-Rก็ไม่ควรมาหลังจากอาร์กิวเมนต์แรก ตัวเลือก (เกือบ) นำหน้าอาร์กิวเมนต์คำสั่งเสมอ นอกจากนี้mvยังไม่มีตัวเลือกและสุดท้ายเรียกซ้ำไม่เกี่ยวข้องกับ-R mv@DimitrisTheodoridis โปรดทดสอบคำตอบของคุณก่อน
zwets

ใช่พี่ชายของคุณถูกต้องฉันมักจะมีปัญหากับการสะกดคำของฉันและ allways ฉันมีปัญหากับสถานีหรือคำสั่งที่ไม่พบหรือสร้างไฟล์และไดเรกทอรีใหม่ที่ฉันไม่รู้เพียงแค่การสะกดฐาน ... โดยวิธีฉัน ใช้คำสั่ง cp, กว่านี้เขียน mv sory สำหรับพี่ชายนั้น: D
Dimitris Theodoridis

4

แน่ใจว่าrsyncใช้งานได้ แต่อาจใช้งานได้กับเครื่องที่ไม่รองรับrsync(เช่นใน cpanel ซึ่ง rsync ไม่ได้ติดตั้งตามค่าเริ่มต้น)

เกี่ยวกับการใช้:

cd /path/to/backup/ && cp -R --parents ./* ../backupArchives

จากนั้นลบbackupไดเรกทอรีหากจำเป็น

หมายเหตุ 1: คุณต้องไปcdยังbackupไดเรกทอรีก่อนที่จะดำเนินการcp -R --parents ...

Note2: ตรวจสอบbackupArchivesไดเรกทอรีอีกครั้งหากคุณได้รับไฟล์ใหม่จากการสำรองข้อมูล


1

ก่อนถามคำถามลองพิจารณากรณีที่ง่ายกว่า

สมมติว่าใน / home / admin เรามีสองโฟลเดอร์fooและbarที่มีโครงสร้างไดเรกทอรีย่อยเดียวกัน แต่แต่ละไฟล์มีไฟล์ที่แตกต่างกัน ตอนนี้เราต้องการรวมมันเข้าเป็นหนึ่งเดียว เมื่อเราทำสิ่งต่าง ๆ เช่นmv foo/* barข้อผิดพลาดmv: directory not emptyเกิดขึ้น

โซลูชันของฉันคือเลิกใช้เครื่องมือบรรทัดคำสั่งและเปลี่ยนเป็นเครื่องมือจัดการไฟล์ GUI ตัวอย่างเช่นปลาโลมา เมื่อคุณเปลี่ยนชื่อfooเป็นbarปลาโลมาจะมีตัวเลือกให้คุณเขียนลงในโฟลเดอร์ปลายทางและถามคุณว่าจะเขียนทับไฟล์ที่มีอยู่แบบโต้ตอบหรือไม่ หลีกเลี่ยงการคัดลอกและลบซึ่งจะช่วยประหยัดเวลาของคุณโดยไม่ต้องใช้รหัสบรรทัดเดียว

PS: ฉันไม่ได้ทดสอบตัวจัดการไฟล์ทุกตัวที่นั่น แต่ส่วนใหญ่ควรมีคุณสมบัตินี้

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