วิธีย้ายไฟล์หลายไฟล์พร้อมกันไปยังไดเรกทอรีปลายทางที่ต้องการได้อย่างไร


152

ฉันได้รับไฟล์จำนวนมากในไดเรกทอรี (พร้อมกับไฟล์อื่น ๆ ) ที่ฉันต้องการย้าย

โชคดีที่ไฟล์ทั้งหมดที่ฉันต้องการย้ายมีตัวระบุบางอย่างในชื่อของพวกเขาดังนั้นฉันสามารถที่ls | grep IDENTIFIERจะรับรายการไฟล์ที่แน่นอนที่จะย้าย

แต่ฉันจะเรียกใช้งานได้mv file /path/to/dest/folder/ในครั้งเดียวและไม่ใช่ทีละไฟล์ (มีไฟล์จำนวนมากที่จะย้าย)

คำตอบ:


100

หากคุณต้องการย้ายABC-IDENTIFIER-XYZ.extหรือIDENTIFIER-XYZ.xmlคุณสามารถใช้:

mv *IDENTIFIER* ~/YourPath/

*เป็นสัญลักษณ์แทนสำหรับศูนย์หรือมากกว่าตัวละครนี้หมายถึงการเป็นศูนย์หรือมากกว่าตัวอักษรตามด้วยIDENTIFIERตามด้วยศูนย์หรือมากกว่าตัวอักษร

นี่จะย้ายไฟล์ทั้งหมดที่มีที่IDENTIFIERคุณระบุ


201

คุณสามารถใช้

mv -t DESTINATION file1 file2 file3

และ

mv -t DESTINATION `ls|grep IDENTIFIER`

ใช้งานได้ แต่ฉันไม่แน่ใจว่าจะเรียก mv หลายครั้งหรือไม่เนื่องจาก grep จะส่งบรรทัดใหม่สำหรับการแข่งขันแต่ละครั้ง


5
ทำงานบน linux ไม่แน่ใจว่าจะใช้กับ mac ได้หรือไม่
Alexander Mills

3
ทำงานบน mac และ git bash ผ่าน git สำหรับ windwows
แบรนด์ Solovij

11
ไม่ทำงานบน Mac (10.11.16 El Capitan) แต่คุณสามารถวางโฟลเดอร์เป้าหมายไว้ด้านหลังคือmv file1 file2 ... destination
Sheljohn

2
-1 สำหรับวิธีที่สองเนื่องจากไฟล์จะตกรวมถึงบรรทัดใหม่
αғsнιη

3
lsทำไมคุณไม่ควรแยกการส่งออกของ
ของหวาน

24

คุณสามารถใช้สัญลักษณ์แทน

ตัวอย่าง: หากต้องการย้ายไฟล์ทั้งหมดที่มีนามสกุล. doc

mv *.doc /path/to/dest/folder/

สิ่งนี้จะย้ายไฟล์เอกสารทั้งหมดภายใต้ไดเรกทอรีปัจจุบันไปยังปลายทางที่ต้องการ

แก้ไข

เพื่อตอบความคิดเห็น

mv *.ext *.xml *.txt /path/to/dest/folder/


2
แต่รายการของไฟล์ที่จะย้ายไม่ได้ถูกกำหนดโดยส่วนขยาย บางส่วนของไฟล์ที่มีชื่อ: ABC-IDENTIFIER-XYZ.extและบางเพียงIDENTIFIER-XYZ.extทั้งหมดที่มีนามสกุลที่แตกต่างกันส่วนใหญ่หรือxml properties
gilad hoch

@giladhoch วิธีการแก้ไขหนึ่งหรือไม่
Achu

@gliadhoch หากคุณรู้สึกสะดวกสบายในการใช้ grep คุณสามารถดูคำตอบของฉันด้านบน / ล่าง
จุดชนวน

จะไม่ทำงานเนื่องจากมี.xmlไฟล์อื่น ๆ(เช่น) ฉันไม่ต้องการย้าย
gilad hoch

20

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

mv file1.ext1 file2.ext2 file3.ext3.. /destination/

ในกรณีที่ไฟล์ถูกกระจัดกระจายในไดเรกทอรีต่าง ๆ คุณจะต้องระบุพา ธ สำหรับแต่ละไฟล์ในคำสั่ง move


10

ฉันใช้เทคนิคของ tuomaz แต่ปรับเปลี่ยนเล็กน้อย:

mv file1 file2 file3 -t DESTINATION

ฉันพบว่ามันง่ายต่อการจดจำและยากที่จะพลาดเพราะมันใช้การเรียงลำดับเดียวกับการทำงานของ vanilla mv:

mv file1 DESTINATION

หน้าคนสำหรับmvไม่พูดถึง-tตัวเลือก
Noumenon

2
linux.die.net/man/1/mvใช่แล้วมัน
geoyws

7

ใช้คำสั่งนี้:

mv `ls|grep IDENTIFIER` /path/to/dest/folder  

อย่างไรก็ตาม ls ไม่แนะนำสำหรับการใช้งานประเภทนี้ ใช้คำสั่งfindแทน


8
lsไม่แนะนำสำหรับการใช้งานประเภทนี้ หากคุณต้องการที่จะแสดงรายการไฟล์โดยเฉพาะอย่างยิ่งกับที่อยู่เบื้องหลังการใช้งานgrep find . -name \*IDENTIFIER\*
NorTicUs

คำตอบนี้เป็นเพียงการสาธิตวิธีที่คุณสามารถใช้เอาต์พุตของคำสั่งก่อนหน้าใน mv ในฐานะที่เป็น ls | grep ถูกกล่าวถึงในคำถามฉันเพิ่งคัดลอกมัน
จุดชนวน

3
ตามที่ระบุไว้โดย @NorTicUs การใช้ ls นั้นไม่แนะนำให้ใช้ นอกจากนี้ไฟล์ที่มีช่องว่างอาจทำให้เกิดปัญหาได้
Paddy Landau


5

หากคุณมีไฟล์จำนวนมากที่จะย้ายคุณสามารถมีจำนวนมากเกินไปสำหรับmvคำสั่ง (หรือคำสั่งอื่น ๆ เช่นrm) ฉันแนะนำให้ใช้xargsเพื่อย้ายแต่ละไฟล์แยกกันในลักษณะคล้ายวง วิธีหนึ่งที่จะหลีกเลี่ยงสิ่งเหล่านี้ได้คือ:

ls -1 | grep IDENTIFIER | xargs -i mv {} /path/to/dest/folder/

ls -1(ลบหนึ่ง) เพื่อให้แน่ใจว่ามีเพียงหนึ่งชื่อไฟล์ในแต่ละบรรทัด หากคุณมีนามแฝงที่ซ่อนอยู่สำหรับlsคำสั่งคุณสามารถมีหลายชื่อไฟล์ในบรรทัดเดียวและย้ายไฟล์โดยไม่ตั้งใจคุณไม่ได้ตั้งใจจะย้าย


สิ่งนี้มีประโยชน์เมื่อ IDENTIFIER ของคุณไม่ได้กลายเป็นไวด์การ์ดอย่างง่ายดายหรือคุณต้องการใช้ grep ที่มี regex ที่ซับซ้อนมากขึ้น
AggieBill

1
+1 สำหรับ xargs การค้นหานั้นดีกว่าและปลอดภัยกว่า ls เสมอ หา IDENTIFIER -exec mv {} / path / to / dest / folder \; (รหัสที่ยังไม่ทดลอง) ใช้สำหรับไดเรกทอรีการทำงานปัจจุบัน The \; คือการสิ้นสุดคำสั่งที่จะดำเนินการ คุณอาจต้องเพิ่ม -maxdepth 1 เพื่อป้องกันไม่ให้เรียกซ้ำลงในไดเรกทอรีย่อยทั้งนี้ขึ้นอยู่กับสิ่งที่คุณทำ
โจ

5

หากไฟล์อยู่ใน dir เดียวกันคุณสามารถใช้

mv /path/to/source/dir/{file1,file2,*.ext1,*.ext2} /path/to/destination/

(ทดสอบใน Ubuntu 16.04)


1
สิ่งนี้ไม่ได้เพิ่มบางสิ่งบางอย่างให้กับคำตอบที่มีอยู่คุณคิดหรือไม่
ของหวาน

1
เพียงแค่ไม่จำเป็นต้องระบุพา ธ เต็มไปยัง dir สำหรับแต่ละไฟล์
Sruli

3
find -type f -name "[range]" -exec mv {} target-directory ';'

คำสั่งนี้จะย้ายชื่อไฟล์ด้วยรูปแบบ / ช่วงใด ๆ ไปยังไดเรกทอรีเป้าหมาย

เช่น.

find -type f -name "file[1-50000]" -exec mv {} target-directory ';'

มันจะย้ายไฟล์ที่มีชื่อเหมือนfile1, file2... เพื่อfile50000target-directory


2

คุณสามารถใช้เอาต์พุตจาก ls เพื่อป้อนเข้าใน mv commnad

mv $(ls | grep IDENTIFIER) /path/to/dest/dir

คำสั่งระหว่าง$()ส่งกลับรายการของชื่อไฟล์ที่ตรงกับการค้นหาของคุณและสามารถให้เป็นพารามิเตอร์สำหรับคำสั่ง mv




1

วิธีที่ง่ายที่สุดคือเช่นนี้

mv {file1,file2,file3} DESTINATION

หรือไดเรกทอรี

mv {directory1,directory2,directory3} DESTINATION

หรือทั้งไฟล์และไดเรกทอรี

mv {file1,file2,file3,directory1,directory2,directory3} DESTINATION

หวังว่านี่จะช่วยได้

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