ฉันจะย้ายไฟล์และไดเรกทอรีไปยังโฟลเดอร์หลักใน Linux ได้อย่างไร


77

ใน Linux (Ubuntu) คุณจะย้ายไฟล์และไดเรกทอรีทั้งหมดไปยังไดเรกทอรีหลักได้อย่างไร


คำถามที่มีคำตอบที่สมบูรณ์ที่สุดที่ฉันพบ: unix.stackexchange.com/q/6393/93768
DJCrashdummy

คำตอบ:


66
หา -maxdepth 1 -exec mv {} .. \;

จะเป็นการย้ายไฟล์ที่ซ่อนอยู่เช่นกัน

คุณจะได้รับข้อความ:

mv: ย้ายไม่ได้ '.' เป็น `../. ': อุปกรณ์หรือทรัพยากรไม่ว่าง

เมื่อพยายามย้าย.(ไดเรกทอรีปัจจุบัน) แต่จะไม่ทำให้เกิดอันตรายใด ๆ


1
มันจะย้ายไฟล์ทั้งหมดจากไดเรกทอรีย่อยทั้งหมดไปที่พาเรนต์ของไดเรกทอรีปัจจุบันด้วย ฉันจะใช้-maxdepth 1เพื่อให้แน่ใจ
ℝaphink

1
ตอนนี้มันบอกว่า: mv: ไม่สามารถเคลื่อนย้าย./scripts' to ../scripts ': ไดเรกทอรีไม่ว่างเปล่า

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

1
มันทำงานได้ แต่คุณปล่อยให้บิตหนึ่งข้อมูลที่สำคัญมาก - คุณต้องเรียกใช้จากไดเรกทอรีย่อย นอกจากนี้สิ่งนี้จะไม่ลบไดเรกทอรีย่อยเองดังนั้นคุณต้องสำรองข้อมูลหนึ่งไดเรกทอรีและทำ rmdir ในไดเรกทอรีย่อย
บ้า

89

ฉันมาที่นี่เพราะฉันใหม่สำหรับเรื่องนี้เช่นกัน ด้วยเหตุผลบางอย่างข้างต้นไม่ได้ทำเคล็ดลับสำหรับฉัน สิ่งที่ฉันทำเพื่อย้ายไฟล์ทั้งหมดจาก dir ไปยัง parent dir คือ:

cd to/the/dir
mv * ../

12
นี้ไม่ย้ายไฟล์ที่ซ่อนแม้ว่า
Wavesailor

1 สายการบิน:(cd ${ANDROID_NDK_HOME}/android-ndk-r14b/ && mv * ../)
Dawid Drozd

10

พิมพ์สิ่งนี้ในเปลือก:

mv *.* ..

ซึ่งจะย้ายไฟล์ทั้งหมดในระดับหนึ่งขึ้นไป

ตัวละคร*เป็นสัญลักษณ์แทน ดังนั้น*.debจะย้ายไฟล์. deb ทั้งหมดและZeitgeist.*จะย้าย Zeitgeist.avi และ Zeitgeist.srt หนึ่งโฟลเดอร์ขึ้นไปเนื่องจากแน่นอน..จะระบุไดเรกทอรีหลัก

หากต้องการย้ายทุกอย่างรวมถึงโฟลเดอร์ ฯลฯ เพียงใช้*แทน*.*


3
นี่มันใช้ไม่ได้กับพวก dirs! หรือไฟล์ที่ซ่อน

มันทำงานร่วมกับ dirs อย่างน้อยสำหรับฉัน
maaartinus

5
คุณต้องการที่จะ*ไม่*.*รวมไดเรกทอรี
Chris S

มันเป็นสารคดีที่ดี
BlackBurn027

6

มันไม่ง่ายกว่า:

mv * ../

ในการย้ายไฟล์ที่ซ่อนอยู่ด้วย:

mv /path/subfolder/{.,}* /path/ 

mvเป็นคำสั่งเพื่อย้ายไฟล์*หมายถึงไฟล์และโฟลเดอร์ทั้งหมดและ../เป็นเส้นทางไปยังไดเรกทอรีหลัก


2

ในทุบตีคุณสามารถใช้ shopt -s dotglob เพื่อทำให้ * จับคู่ไฟล์ทั้งหมดและย้ายไฟล์ได้ง่ายๆ

shopt -s dotglob; mv * ..

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

shopt -u dotglob

แต่ฉันคิดว่ามันดีที่จะรู้


4
เรียกว่าใน subshell (shopt -s dotglob && mv * ..)นี้: ด้วยวิธีนี้ตัวเลือกจะอยู่ภายในกับเชลล์ย่อยนั้นเท่านั้น
มาร์ติน Ueding

คำตอบที่ดี - มันง่ายมีไฟล์ที่ซ่อนอยู่และไม่ทำให้เกิดข้อผิดพลาดเกี่ยวกับการคัดลอก '.' และ '.. '
Daniel Howard

1

วิธีการที่ทำให้ไม่มีข้อผิดพลาดและทำงานทุกครั้ง:

ls -1A . | while read -r file                                                    
do                                                                                  
    mv "./${file}" ..                                                            
done

1
find . -maxdepth 2 -type f -exec mv {} .. \;

ฉันใช้รูปแบบด้านบนเพื่อย้ายไฟล์ทั้งหมดจากโฟลเดอร์ย่อยไปยังพาเรนต์

ฉันได้รับข้อมูลในโฟลเดอร์ตามปี แต่พบโดยใช้เมทาดาทาฉันสามารถเก็บข้อมูลทั้งหมดไว้ในโฟลเดอร์เดียวกันซึ่งทำให้จัดการได้ง่ายขึ้น

เช่น.

/data/2001/file_1
/data/2002/file_2
/data/2003/file_3

0

สมมติว่าไฟล์ที่ซ่อนของคุณเริ่มต้นด้วยจุดตามด้วยตัวอักษรหรือตัวเลข (ซึ่งควรใช้) คุณสามารถใช้

mv * .[A-Za-z0-9]* ..

.[A-Za-z0-9]*ส่วนหนึ่งคือการทำให้แน่ใจว่าคุณไม่พยายามที่จะย้าย.หรือ..พร้อมที่จะล้มเหลว


0

การย้ายไฟล์และโฟลเดอร์ทั้งหมดไปยังไดเรกทอรีหลักใน Linux ทำได้ง่าย

ไปที่โฟลเดอร์นั้นและใช้คำสั่งนี้:

mv * /the full path

ตัวอย่างเช่นหากไฟล์และโฟลเดอร์ของคุณเป็นดังนี้:

/home/abcuser/test/1.txt 
                   2.txt
                   3.jpg
                   4.php
                   1folder
                   2folder

ไปที่โฟลเดอร์นั้นผ่าน cd:

cd /home/abcuser/test
mv * /home/abcuser

ไฟล์และโฟลเดอร์ทั้งหมดของคุณจะย้ายไปที่โฟลเดอร์ abcuser (ไดเรกทอรีหลัก)


2
ขอบคุณ @Gareth เป็นเรื่องเดียวกัน อืมม, โปรดอย่าโพสต์ลิงก์ที่ไม่เกี่ยวข้องใด ๆ , ความรู้สึกในนั้นคืออะไร? โปรดตรวจสอบการจัดรูปแบบของคุณด้วย นอกจากนี้/the full pathไม่ทำงานใน Linux /the\ full\ pathคุณจะต้องหลบหนีช่องว่างด้วย
slhck

0

ไม่จำเป็นต้องเปลี่ยนไดเรกทอรี เพียงรวม * ที่ท้ายเส้นทาง:

mv /my/folder/child/* /my/folder/

ด้านบนย้ายเฉพาะไฟล์ที่ไม่ซ่อน หากต้องการย้ายเฉพาะไฟล์ที่ซ่อนอยู่ให้ใช้ *

mv /my/folder/child/.* /my/folder/

เหนือสองสามารถรวมในคำสั่งเดียว:

mv /my/folder/child/{.,}* /my/folder/

ดูเพิ่มเติมที่: วิธีย้ายไฟล์ทั้งหมดรวมถึงไฟล์ที่ซ่อนอยู่ในไดเรกทอรีหลักผ่าน *


0
find -type f|while read line; do mv $line ${line##*/}; done

ขอบคุณสำหรับการตอบคำถาม ขณะนี้อาจทำงานในสถานการณ์ง่ายท่อfindเข้าwhile readเป็นวิธีที่ดีที่จะใช้findและคำตอบที่ดีได้รับการโพสต์แล้ว
สกอตต์

-1

สลับไปที่ไดเรกทอรีย่อยและเรียกใช้คำสั่งต่อไปนี้เพื่อคัดลอกหรือย้ายไฟล์

ตัวอย่าง: a คือไดเรกทอรีหลักและ b เป็นไดเรกทอรีย่อยเราต้องการย้าย / คัดลอกไฟล์ทั้งหมดจาก b ไปยัง a (ไดเรกทอรีย่อยไปยังไดเรกทอรีหลัก)

cd b
cp * ..
mv * ..

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