ฉันจะย้ายไฟล์ทั้งหมดจากโฟลเดอร์หนึ่งไปยังอีกโฟลเดอร์โดยใช้บรรทัดคำสั่งได้อย่างไร


245

ฉันต้องการทราบว่าฉันสามารถย้ายไฟล์ทั้งหมดจากโฟลเดอร์ไปยังโฟลเดอร์อื่นด้วยบรรทัดคำสั่งได้อย่างไร

สมมติว่าฉันอยู่ในโฟลเดอร์ดาวน์โหลดและมีไฟล์ 100 ไฟล์ที่ฉันต้องการย้ายไปยังโฟลเดอร์วิดีโอของฉันโดยไม่ต้องเขียนชื่อไฟล์ทั้งหมด


คุณกำลังถามเกี่ยวกับการเคลื่อนไหวfilesแต่มีคนแสดงวิธีย้ายไม่เพียงfilesแต่foldersเช่นกัน ไม่เป็นไร?
Askar

2
@ Hontvári Levente ให้คำตอบเมื่อปีที่แล้วดูเหมือนจะดีที่สุดสะอาดเรียบง่ายและใช้งานได้ ดังนั้นมันจึงได้รับเพียง 3 คะแนน (เมื่อเทียบกับ 262 สำหรับคำตอบปัจจุบันที่ด้านบน)?
เรย์บัตเตอร์เวิร์ ธ

คำตอบ:


331

เปิด terminal และดำเนินการคำสั่งนี้:

mv  -v ~/Downloads/* ~/Videos/

มันจะย้ายไฟล์และโฟลเดอร์ทั้งหมดจากโฟลเดอร์ดาวน์โหลดไปยังโฟลเดอร์วิดีโอ


หากต้องการย้ายไฟล์ทั้งหมด แต่ไม่ใช่โฟลเดอร์:

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

find ~/Downloads/ -type f -print0 | xargs -0 mv -t ~/Videos

หากต้องการย้ายเฉพาะไฟล์จากโฟลเดอร์ดาวน์โหลด แต่ไม่ใช่จากโฟลเดอร์ย่อย:

หากคุณต้องการย้ายไฟล์ทั้งหมดจากโฟลเดอร์ดาวน์โหลด แต่ไม่ใช่ไฟล์ภายในโฟลเดอร์ในโฟลเดอร์ดาวน์โหลดให้ใช้คำสั่งนี้:

find ~/Downloads/ -maxdepth 1 -type f -print0 | xargs -0 mv -t ~/Videos

ที่นี่-maxdepthตัวเลือกระบุว่าการค้นหาแบบลึกควรลอง1หมายถึงเฉพาะไดเรกทอรีที่ระบุในคำสั่ง find คุณสามารถลองใช้2, 3ยังที่จะทดสอบ

ดูmanpageของ Ubuntu เพื่อค้นหาคำอธิบายโดยละเอียด


3
คุณสามารถใช้ mv เพียงอย่างเดียวเพื่อย้ายไดเรกทอรีทั้งหมดไปยังโฟลเดอร์อื่น: โฟลเดอร์ mv ~ / Documents
JohnMerlino

20
FYI ฉันเชื่อว่าคำสั่งแรกของคุณ ("mv -v ~ / Downloads / * ~ / Videos /") จะไม่ย้ายไฟล์ dot
Mark Doliner

1
ใช่แล้วมันจะไม่ย้ายไฟล์.
Anwar

3
nb คุณ-print0 | xargs -0 mv -t ~/Videosสามารถทำได้อย่างมีประสิทธิภาพยิ่งขึ้นด้วย-exec mv -t ~/Videos \{\} \+:-)
artfulrobot

3
mv -v ~/Downloads/* ~/Videos/ไม่สามารถใช้งานไฟล์ที่ซ่อนได้
FreeLightman

28
mv ~/Downloads/* ~/Videos

mvมันจะย้ายไฟล์ทั้งหมดรวมทั้งโฟลเดอร์ย่อยในไดเรกทอรีที่คุณต้องการ หากคุณต้องการcp(คัดลอก) หรือrm(ลบ) คุณจะต้อง-rใช้ตัวเลือก (เรียกซ้ำ) เพื่อรวมโฟลเดอร์ย่อย


2
คำสั่ง mv ของฉันไม่มีตัวเลือก -R (Ubuntu 14.04)
Mark Doliner

1
@ MarkDoliner ใช่mvไม่จำเป็นต้องใช้ตัวเลือกแบบเรียกซ้ำเพื่อรวมโฟลเดอร์ย่อย หนึ่งสามารถใช้มันเพื่อการเปลี่ยนชื่อ
Alen

ฉันไม่ต้องการ * สิ่งเดียวกันเกิดขึ้นโดยไม่ใช้ดาว
MycrofD

~ / ในส่วนนำหน้าของชื่อโฟลเดอร์จะไม่ทำงานเสมอไป (ไม่สามารถใช้งานได้กับ bash และ git atleast)
Krish Munot

วิธีการแก้ปัญหานี้จะให้ข้อผิดพลาดหากไดเรกทอรีแหล่งที่ว่างเปล่า
Pierre Thibault

11

สำหรับกรณีง่าย ๆ :

mv ~/Downloads/* ~/Videos

หากคุณต้องการย้ายจุด (ซ่อน) ไฟล์ด้วยให้ตั้งค่าตัวเลือกเปลือกdotglob

shopt -s dotglob
mv ~/Downloads/* ~/Videos

สิ่งนี้ทำให้ชุดตัวเลือกของเชลล์

สำหรับการใช้ dotglob ครั้งเดียวให้เรียกใช้คำสั่งในเชลล์ย่อย:

(shopt -s dotglob; mv ~/Downloads/* ~/Videos)

หมายเหตุสำหรับตัวเอง: ตัวเลือกสุดท้ายจะย้าย(shopt -s dotglob; mv ~/Downloads/* ~/Videos) เท่านั้น (ตัด) เนื้อหา (รวมถึงไฟล์ที่ซ่อนอยู่) ในกรณีนี้ต้องมีทั้งโฟลเดอร์ต้นทางและปลายทาง ในตอนท้ายไดเรกทอรีต้นทางจะว่างเปล่า
Pathros

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
megar

11

เป็นไปได้โดยใช้rsyncตัวอย่างเช่น:

rsync -vau --remove-source-files src/ dst/

ที่อยู่:

-v, --verbose: เพิ่มการฟุ่มเฟื่อย

-a, --archive: โหมดเก็บถาวร; เท่ากับ-rlptgoD(ไม่-H, -A, -X)

-u, --update: ข้ามไฟล์ที่ใหม่กว่าบนตัวรับ

--remove-source-files สิ่งนี้บอกrsyncให้ลบออกจากด้านการส่งไฟล์ (หมายถึงไม่ใช่ไดเรกทอรี) ที่เป็นส่วนหนึ่งของการถ่ายโอนและทำซ้ำสำเร็จในด้านการรับ

หากคุณได้รับสิทธิ์รูทนำหน้าด้วยsudoเพื่อลบล้างปัญหาสิทธิ์ที่อาจเกิดขึ้น


1
คำเตือน! ตัวเลือก - ลบหลังตามที่ระบุไม่ทำงานในแบบที่คุณอาจคาดหวัง มันจะไม่ลบไฟล์ต้นฉบับหลังจากคัดลอกสำเร็จ ... มันจะลบไฟล์อื่น ๆ ที่เหลืออยู่ในปลายทาง (ตามที่ @kenorb ระบุไว้ ... แต่ฉันไม่ได้อ่านอย่างละเอียดพอ! DOH)
Jay Marm

4

ใช้

mv -v ~/rootfolder/branch/* ~/rootfolder

ฉันหวังว่านี่จะช่วยได้. เพราะฉันมีความเจ็บปวดแบบเดียวกันและเสียเวลามากในการแก้ไขความผิดพลาดของฉัน


2

หากต้องการย้ายไดเรกทอรีที่มีหรือไม่มีเนื้อหาไปยังชื่อใหม่เช่นเดียวกับที่คุณใช้mvคำสั่งเพื่อเปลี่ยนชื่อไฟล์:

mv -T dir1 dir2

ที่อยู่:

  • -T ถือว่าปลายทางเป็นไฟล์ปกติ
  • dir1 เป็นชื่อดั้งเดิมของไดเรกทอรี
  • dir2 เป็นชื่อใหม่ของไดเรกทอรี

หมายเหตุ: dir2ไม่จำเป็นต้องมีอยู่

ฉันหวังว่าสิ่งนี้จะช่วยให้ใครบางคนประหยัดเวลาได้มากเหมือน noob ก่อนหน้านี้ฉันจะสร้างไดเรกทอรีที่มีชื่อใหม่แล้วย้ายเนื้อหาของไดเรกทอรีไปยังไดเรกทอรีที่สร้างขึ้นก่อนหน้านี้

ใช้สำหรับไดเรกทอรีย่อย

Downloads/mp4คำสั่งนี้จะเป็นประโยชน์เมื่อไฟล์จำนวนมากได้รับการบันทึกในโฟลเดอร์ย่อยของไดเรกทอรีคือเป้าหมาย ในตัวอย่างนี้การรันmv -T Downloads/mp4 Videosจะส่งผลให้mp4โฟลเดอร์ย่อยถูกลบและไฟล์ทั้งหมดที่อยู่ภายในจะถูกย้ายไปยังโฟลเดอร์วิดีโอ


1
+1 เนื่องจากผ่านการทดสอบการทำงานใน Xubuntu 14.04 ฉันได้เพิ่มตัวอย่างในคำตอบนี้เพื่อแสดงว่าคำสั่งนี้จะทำให้การdir1ลบ นอกเหนือจากข้อควรระวังนี้คำตอบนี้ยังระบุถึงสิ่งที่ดีสำหรับการใช้งานประจำวัน
clearkimura

1
"ในการย้ายไดเรกทอรีที่มีหรือไม่มีเนื้อหาไปยังชื่อใหม่" คุณจะย้ายไดเรกทอรี ... ไปยังชื่อได้อย่างไร มันไม่สมเหตุสมผลเลย "-T ถือว่าปลายทางเป็นไฟล์ปกติ" ปลายทางสามารถเป็นไฟล์ได้อย่างไร คุณหมายถึงไดเรกทอรีหรือไม่
โมนิก้า Heddneck

มันเหมือนการเปลี่ยนชื่อไฟล์เป็นชื่อใหม่เหมือนที่คุณทำกับสิ่งที่ชอบmv fileA fileBแต่การ-Tตั้งค่าสถานะในกรณีนี้ถือว่าปลายทาง / ไดเรกทอรีเป็นไฟล์และเปลี่ยนชื่อ
Feyisayo Sonubi

ทำงานให้ฉัน :)
Naveen Kumar V

1
  1. ไปที่บรรทัดคำสั่งและเข้าไปในไดเรกทอรีที่คุณต้องการย้ายไปด้วย cd folderNamehere
  2. ประเภทpwd. นี่จะพิมพ์ไดเรกทอรีที่คุณต้องการย้ายด้วย
  3. จากนั้นเปลี่ยนเป็นไดเรกทอรีที่มีไฟล์ทั้งหมดอยู่ด้วย cd folderNamehere
  4. ตอนนี้ย้ายไฟล์ทุกชนิด mv *.* typeAnswerFromStep2here

ที่จะย้ายไฟล์ทั้งหมดจากไดเรกทอรีนั้นไปยังอีก


3
สิ่งนี้จะไม่จับคู่ไฟล์โดยไม่มีส่วนขยายใด ๆ ตัวอย่างเช่นหากโฟลเดอร์มีไฟล์: foo.txt, bar.และbarทั้งสองอย่างbar.และbarจะไม่ถูกย้าย ใช้*แทน*.*การดูแลที่ แต่ในทั้งสองกรณีไฟล์ที่ซ่อนเช่น: .foobarจะไม่ถูกย้าย
ด่าน

1
mv source_path/* destination_path/

ที่นี่คุณต้องใส่เครื่องหมายทับหน้าและ*หลังพา ธ ต้นทางเพื่อที่จะใช้ไฟล์ภายใน source_path แทนที่จะเป็นไดเร็กทอรีต้นทางแบบสมบูรณ์

ตัวอย่าง: mv /home/username/test/* /home/username/test2/

คำสั่งดังกล่าวย้ายไฟล์ทั้งหมด (เว้นแต่พวกเขาจะถูกซ่อนอยู่) ในไดเรกทอรีต้นทางไปยังไดเรกทอรีปลายทาง


0

ลองมัน

find ~/Desktop -type f -iname  "*.mp4" -exec mv {} ~/Videos \;

-type พร้อมกับอาร์กิวเมนต์ -type คุณสามารถระบุ type file.on คำสั่งนี้ที่เป็นค่าเฉลี่ย file.if โดยใช้ -d ที่หมายถึงไดเรกทอรี

- ชื่อ: วิธีที่พบได้บ่อยและชัดเจนที่สุดในการค้นหาไฟล์คือการใช้ -name argument.if ของคุณไม่แน่ใจเกี่ยวกับตัวพิมพ์เล็ก - ใหญ่คุณสามารถใช้อาร์กิวเมนต์ -iname

mv {} และสุดท้ายเพื่อระบุไดเรกทอรีเป้าหมายจากนั้นย้ายไฟล์ไปที่นั่นโดยใช้อาร์กิวเมนต์ mv {}

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