ฉันจะย้ายไฟล์ออกจากไดเรกทอรีย่อยที่ซ้อนกันไปยังโฟลเดอร์อื่นใน Ubuntu ได้อย่างไร (พยายามตัดโฟลเดอร์ย่อยหลาย ๆ โฟลเดอร์)


36

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

ฉันมีโครงสร้างโฟลเดอร์ที่น่าเกลียดอย่างยิ่งโดยมีไฟล์. mp3 บางไฟล์ฝังอยู่ในระดับลึก 6 ระดับในโฟลเดอร์ย่อย

ฉันต้องการที่จะจบลงด้วยไฟล์ทั้งหมด (ส่วนใหญ่เป็น. mp3 แต่ไม่ใช่ทั้งหมด) ในไดเรกทอรีเดียวโดยไม่มีไดเรกทอรีย่อยเลยโดยใช้ Ubuntu

ช่วยด้วย?

คำตอบ:


48

มีคำตอบที่ดีคือใน askubuntu-QA

หากต้องการทำเช่นนั้นให้เปิดเทอร์มินัลแล้วดำเนินการคำสั่งนี้:

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 เพื่อค้นหาคำอธิบายโดยละเอียด

แหล่ง


หากสิ่งที่ฉันต้องการทำคือคัดลอกไฟล์ทั้งหมดไปยังโฟลเดอร์ฉันจะต้องเปลี่ยน mv เป็น cp หรือไม่ ฉันใหม่กับ linux
Neoryder

13

วิธีการแก้

find /src/dir -type f -exec mv --backup=numbered -t /dst/dir {} +

คำสั่งจะหาไฟล์ปกติทั้งหมดภายใต้/src/dir(รวมทั้งไดเรกทอรีย่อยทั้งหมด) และย้ายไปยังโดยการใช้คำสั่ง/dst/dir mvเพียงแทนที่ไดเรกทอรีของคุณเอง ไฟล์ที่มีชื่อเดียวกันจะถูกเปลี่ยนชื่อโดยอัตโนมัติ

การเลือกไฟล์ที่จะย้าย

หากคุณต้องการย้ายเฉพาะไฟล์ MP3 ให้เพิ่ม-iname "*.mp3"ตัวเลือกในfindคำสั่งหลังจาก-type fนั้น

เปรียบเทียบกับการตอบกลับโดย c0dev

เฉพาะคำสั่งที่สองในการตอบของ c0dev เท่านั้นที่ตอบคำถาม ด้านล่างนี้เป็นวิธีเปรียบเทียบกับคำตอบนี้ คะแนน 3 และ 4 สามารถแก้ไขได้ในอีกทางหนึ่งตอบเช่นเดียวกับที่นี่

  1. ยกเว้นmvการแก้ปัญหาด้วย-exec +ไม่จำเป็นต้องเรียกคำสั่งเพิ่มเติมเช่นxargsหรือparallelส่งชื่อไฟล์สองครั้ง
  2. คำตอบอื่น ๆ จะเขียนทับไฟล์ที่มีชื่อเหมือนกันในใจ --backup=numberedนี่ไฟล์จะถูกเปลี่ยนชื่อขอบคุณไปยังตัวเลือกโดยอัตโนมัติ น่าเสียดายที่การสำรองข้อมูลที่มีคำต่อท้ายเหล่านี้~3~จะถูกซ่อนไว้ในส่วนใหญ่ของไฟล์ที่จัดการตามค่าเริ่มต้น น่าเสียดายที่mvไม่อนุญาตให้เปลี่ยนคำต่อท้าย แต่สามารถประมวลผลได้อย่างง่ายดายโดยคำสั่งเพิ่มเติม นี่คือส่วนขยาย GNU
  3. ตรงกันข้ามกับ-print0 -exec command {} +ส่วนหนึ่งของ IEEE Std 1003.1 (POSIX), ISO / IEC 9945 และมาตรฐานข้อมูลจำเพาะ UNIX เดี่ยว ดังนั้นควรพกพาได้มากกว่า ดูIEEE Std 1003.1 2004 ฉบับ , IEEE Std 1003.1 2013 ฉบับและ0,000,243: เพิ่ม -print0 ที่ "ค้นหา" แต่อย่างไรก็ตาม-tสวิตช์ที่ต้องการmvคือส่วนขยาย GNU ดังนั้นคำสั่งทั้งหมดจึงไม่สามารถเคลื่อนย้ายได้ระหว่างระบบ POSIX

หมายเหตุ: ในกรณีที่findจะสามารถผลิตเส้นทางเริ่มต้นด้วย-(ผมไม่ทราบว่าการดำเนินการดังกล่าวใด ๆfindในขณะนี้.) The ควรจะนำหน้าด้วยตัวบ่งชี้ที่สิ้นสุดของตัวเลือก:{}--


ข้อผิดพลาด: ค้นหา: ไม่มีอาร์กิวเมนต์สำหรับ `-exec '
Chris

@Chris: ถูกต้องดูเหมือนว่า{}จะต้องเป็นอาร์กิวเมนต์สุดท้าย การแก้ไข
pabouk

@Chris: มันทำงานได้ตามที่คุณต้องการหรือไม่? หากใช่คุณอาจยอมรับคำตอบได้ดังนั้นคำถามของคุณจะไม่ปรากฏเป็น "ไม่ได้รับการแก้ไข"
pabouk

นี่คือสิ่งที่ฉันกำลังทำงานอยู่และได้รับข้อผิดพลาดที่ไม่พบไดเรกทอรี:
Chris

สิ่งที่ฉันกำลังทำงาน: clstal @ clap: ~ $ ls 1st script.R Firefox_wallpaper.png part1vidproj zotero ผู้จัดการ pdf เดสก์ท็อป mozilla.pdf รูปภาพเอกสารแม่วิดีโอ clstal @ clap: ~ $ ค้นหา / แหล่งที่มา / ไดเรกทอรี -type f -exec mv -t / destination / directory {} + find: `/ source / directory ': ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
Chris

2

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

ปัญหา

รูปแบบของข้อความต่อไปนี้ถูกจัดเตรียมหลังจากเริ่มต้นคำสั่ง คำสั่งจะสร้างหลายไฟล์

mv: `/data/share/docs/src/dir/filename.ext' and `/data/share/docs/src/dst/filename.ext' are the same file

สาเหตุ

The /srcเป็นพาเรนต์ของ/dst(เช่น/src/../dst/)

วิธีการแก้

ในขณะที่อาจจะมีวิธีแก้ปัญหาที่ดีกว่าฉันเพียงแค่ย้ายไฟล์ไปยังไดเรกทอรีชั่วคราวด้านนอกของฉัน/srcแล้วรันคำสั่งอีกครั้งเพื่อให้พวกมันกลับมาภายใน/src/../dstไดเรกทอรีที่ฉันต้องการให้พวกมันจบลง


2

สายการบินเดียวของฉัน - ใช้ได้กับ Macs แต่ควรใช้กับ * ระวัง เริ่มต้นจากไดเรกทอรีหลัก

# Move files to parent and delete empty folders
find . -not -type d -print0 | xargs -0J % mv -f % . ; find . -type d -depth -print0 | xargs -0 rm -rf

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


(1) โปรดอธิบายสิ่งที่คำตอบของคุณทำและข้อดีใด ๆ ที่มีเหนือคำตอบอื่น ๆ (ซึ่งคล้ายกันมาก) กรุณาอย่าตอบในความคิดเห็น; แก้ไข  คำตอบของคุณเพื่อให้ชัดเจนและสมบูรณ์ยิ่งขึ้น (2) โปรดทราบว่า-notผู้ประกอบการที่ไม่ได้มาตรฐานดังนั้นคำสั่งของคุณพกพาน้อยกว่าคนอื่น ๆ
สกอตต์

หา -not -type d -print0 | xargs -0J% mv -f% ; หา -type d -depth -print0 | xargs -0 rm -rf ฉันรันคำสั่งนี้ในโฟลเดอร์และลบโฟลเดอร์ย่อยโฟลเดอร์ที่ฉันอยู่แล้วย้ายไปยังโฟลเดอร์หลัก โชคดีที่ฉันเฝ้าดูตัวจัดการไฟล์ของฉันและจัดการเพื่อหยุดคำสั่งและทำงานในโฟลเดอร์ทดสอบ
จะ

1

เปิดเทอร์มินัล, cd ไปยังโฟลเดอร์โฟลเดอร์พร้อมไฟล์และเรียกใช้find . -mindepth 2 -type f -print -exec mv {} . \; เพื่อย้ายไฟล์ทั้งหมดจากไดเรกทอรีย่อยเหล่านี้ไปยังไฟล์ปัจจุบัน

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