วิธีย้ายเฉพาะไฟล์ต่าง ๆ ในระบบปฏิบัติการยูนิกซ์


18

ฉันจะย้ายเฉพาะไฟล์ธรรมดา (ไม่ใช่ไดเรกทอรี) จากโฟลเดอร์หนึ่งใน Linux ไปยังโฟลเดอร์อื่นโดยใช้mvคำสั่งได้อย่างไร

ฉันลองmv * ~/แล้ว แต่มันคัดลอกทุกอย่างรวมถึงไดเรกทอรี


ความคิดเห็นของคุณพูดถึงข้อ จำกัด เพิ่มเติม: คำสั่งไม่ควรย้ายไฟล์ที่ซ่อนอยู่จากไดเรกทอรีการทำงานปัจจุบัน หากถูกต้องคุณสามารถแก้ไขคำถามของคุณเพื่อพูดถึงเรื่องนี้ได้หรือไม่? การบอกว่า "ย้ายเฉพาะไฟล์" ทำให้เราคิดว่า "ย้ายไฟล์ทั้งหมด" ซึ่งรวมถึงไฟล์ที่ซ่อนอยู่
ต้มตุ๋น Quixote

คำตอบ:


29

คุณสามารถลอง

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

2
ว้าวคนที่รู้วิธีใช้ค้นหา เพื่อความสมบูรณ์คุณควรใช้ -name [^.] * ในการค้นหาเช่น --- find -maxdepth 1 -type f -name [^.] * -exec mv {} path \;
chris

อย่าคัดลอกวางลงในเปลือกของคุณ อัฒภาคจะทำให้มันดำเนินการทันที :)
Sherwood Callaway

@SherwoodCallaway อัฒภาคคือการทำเครื่องหมายจุดสิ้นสุด-exec
dstonek

4

ฉันเป็น "ใช้ค้อนสำหรับทุกอย่าง" คนที่แต่งตัวประหลาดดังนั้นฉันจึงใช้โปรแกรมเชลล์ bourne สำหรับสิ่งที่คนอื่นใช้โปรแกรมภายนอกสำหรับ ...

for file in * .* 
do
  test -f "$file" && mv "$file" "$HOME"/
done

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

YMMV แม้ว่า ...


ขอบคุณที่ฉันจะลอง แต่ฉันยังต้องการคำตอบอื่น ๆ เพราะมันเป็นโครงการที่ฉันทำในหลักสูตรลินุกซ์ ขอบคุณมาก

1
นี่คือคำตอบสำหรับคำถามของคุณ mv ไม่มีความเข้าใจในไฟล์หรือไดเรกทอรีหรือ Fifos หรือไฟล์พิเศษอื่น ๆ mv เข้าใจเฉพาะรายการไดเรกทอรีและ inodes และเท่าที่มันเกี่ยวข้องมันก็เหมือนกันโดยไม่คำนึงถึงชนิดของไฟล์ ในการอนุญาตให้ mv ย้ายเฉพาะไฟล์ประเภทใดประเภทหนึ่งคุณต้องมีบางอย่างเช่นการทดสอบหรือการค้นหาที่สามารถดู inode เพื่อดูว่าไฟล์นั้นเป็นอย่างไร กล่าวอีกนัยหนึ่งคุณกำลังถูกถามคำถามเล่ห์เหลี่ยมหากคุณถูกขอให้ทำเฉพาะกับ mv เท่านั้น
Chris

1
และฉันบอกว่า mv เข้าใจ inodes เพียงเพราะมันสามารถย้ายไฟล์จากระบบไฟล์หนึ่งไปยังอีกระบบซึ่งเป็นเทคนิค cp แล้ว rm ไม่ใช่ mv (ซึ่งจริงๆแล้วเป็นแค่ ln rm) ดูรายการลิงก์และไดเรกทอรี
Chris

2
shorty: นี่เป็นคำตอบที่ดีคุณต้องใช้บางอย่างนอกเหนือจากคำสั่ง mv (อย่างน้อยเชลล์) นี่เป็นเรื่องพื้นฐานที่ได้รับโดยไม่ต้องเขียนโปรแกรม
Kyle Brandt

3

@ Mereghost อยู่ใกล้มาก นี่คือสิ่งที่ฉันจะย้ายไฟล์ทั้งหมด (รวมถึงไฟล์ที่ซ่อน) แต่ไม่ใช่ไดเรกทอรี:

find . -maxdepth 1 -type f -name '*' -exec mv -n {} /destination_path \;

.หลังจากที่พบจะถือว่าคุณไดเรกทอรีปัจจุบันเป็นแหล่งที่มาของไฟล์ที่คุณต้องการที่จะย้าย หากไม่สามารถแก้ไขคำสั่งได้ดังต่อไปนี้:

find /source_path -maxdepth 1 -type f -name '*' -exec mv -n {} /dest_path \;

หากคุณต้องการย้ายเฉพาะไฟล์ปกติและไม่ใช่ไฟล์ที่ซ่อนอยู่:

find . -maxdepth 1 -type f -name '[!.]*' -exec mv -n {} /dest_path \;

หากคุณต้องการย้ายเฉพาะไฟล์ที่ซ่อนอยู่และไม่ใช่ไฟล์ปกติ:

find . -maxdepth 1 -type f -name '.*' -exec mv -n {} /dest_path \;

0

หากคุณไม่มีโฟลเดอร์ที่มีชื่อมีจุดอยู่คุณสามารถย้ายโฟลเดอร์ทั้งหมดได้ง่ายๆ

mv ~ / destinationfolder

(ข้อสันนิษฐานของฉันคือไฟล์ทั้งหมดของคุณเป็นบางสิ่งบางอย่าง (ในกรณีของฉันมักจะเป็นทั้งหมด))

แต่ต้องขอบคุณคำตอบอื่น ๆ - มีประโยชน์มาก ขอบคุณ


-1

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

find * -maxdepth 1 -type f -exec mv {} ~ \;

ใช่มันใช้งานได้ดี แต่ไม่ได้ 100% มันก็อปปี้ไฟล์ทั้งหมดจากไดเร็กตอรี่และไดเร็กตอรี่ย่อยไปยัง ~ / location. ฉันต้องการบางสิ่งที่ธรรมดามากที่คัดลอกไฟล์โดยไม่มีไฟล์ที่ซ่อนจาก dir ฉันอยู่ใน dir อื่น แค่นั้นแหละ. ขอบคุณสำหรับคำแนะนำต่อไป

ที่เป็นไปไม่ได้กับ maxdepth เป็น 1
John T

แก้ไขแล้วดังนั้นมันจะไม่คัดลอกไฟล์ที่ซ่อนอยู่
John T

1
ไวยากรณ์ในการค้นหาคือจากนั้นไดเรกทอรีจากนั้นคำอธิบายของการดำเนินงานและสิ่งที่จะจับคู่ โดยทั่วไปแล้วจะไม่ใช้ wildcard เช่น find * โดยไม่ปกป้องจาก globbing (เช่น find / path / to / directory - ชื่อ goo * -type f.
chris

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

-2

mv `find ./sourcedir/* -type f` ./destdir


2
สิ่งนี้จะล้มเหลวสำหรับไฟล์ใด ๆ ที่มีช่องว่างในชื่อ เอาต์พุตของคำสั่งที่พิมพ์ชื่อไฟล์ไม่ควรถูกแยกวิเคราะห์เว้นแต่จะสามารถรับประกันได้ว่ามันถูกคั่นอย่างถูกต้อง ดูสาเหตุที่คุณไม่ควรแยกวิเคราะห์ผลลัพธ์ของ ls (1)สำหรับแนวคิดหลัก การใช้findของ-execตัวเลือกวิธีที่ดีที่สุดที่จะหลีกเลี่ยงปัญหา
slhck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.