ย้ายไฟล์ทั้งหมดด้วยส่วนขยายที่แน่นอนจากหลายไดเรกทอรีย่อยลงในไดเรกทอรีเดียว


42

ฉันมีไฟล์. zip หลายไฟล์ในหลายไดเรกทอรี:

Fol1/Fol2
Fol3
Fol4/Fol5

ฉันจะย้ายพวกเขาทั้งหมดไปยังโฟลเดอร์ฐานทั่วไปได้อย่างไร


คุณต้องการที่จะรักษาโครงสร้างไดเรกทอรีหรือไม่? คุณต้องการย้ายไดเรกทอรีหรือเพียงแค่ไฟล์ zip?
จอร์แดน

ฉันแค่ต้องการย้ายไฟล์ zip ฉันไม่สนใจไดเรกทอรีจริงๆ - สามารถทิ้งไว้ตามลำพังหรือถูกลบได้
InquilineKea

คำตอบ:


54

ไปที่ไดเรกทอรีระดับบนสุดของทรีที่มีไฟล์ zip ( cd …) จากนั้นเรียกใช้

mv **/*.zip /path/to/single/target/directory

สิ่งนี้ทำงานนอกกรอบใน zsh ถ้าเปลือกของคุณเป็นทุบตีคุณจะต้องเรียกใช้shopt -s globstarครั้งแรก (ที่คุณสามารถและควรใส่คำสั่งนี้ในของคุณ~/.bashrc) หากเชลล์ของคุณคือ ksh คุณจะต้องรันset -o globstarก่อน (ใส่ไว้ในของคุณ~/.kshrc)

อีกทางเลือกหนึ่งใช้findงานได้ทุกที่โดยไม่มีการเตรียมเป็นพิเศษ แต่ซับซ้อนกว่า:

find . -name '*.zip' -exec mv {} /path/to/single/target/directory \;

หากคุณต้องการลบไดเรกทอรีที่ว่างเปล่าในภายหลังใน zsh:

rmdir **/*(/^Fod)

ใน bash หรือ ksh:

rmdir **/*/

และทำซ้ำตราบใดที่มีไดเรกทอรีว่างเปล่าที่จะลบ หรือในเชลล์ใดก็ได้

find . -depth -type d -empty -exec rmdir {} \;

findคำสั่งแรกข้างต้นทำงานในทุบตี แต่ต้องเปลี่ยนfind . -nameฯลฯ เพื่อให้ทำงาน
JeffThompson

1
@Jeff .เป็นนัยสำหรับ GNU แต่ไม่ใช่สำหรับคนอื่นฉันได้เพิ่มไว้อย่างชัดเจนแล้ว
Gilles 'หยุดชั่วร้าย'


3

หากคุณใช้bashเวอร์ชัน 4 หรือสูงกว่าหรือzshคุณสามารถใช้การวนซ้ำแบบวนซ้ำได้:

mv **/*.zip /path/to/move/zip/files/to

สิ่งนี้จะย้ายเฉพาะไฟล์และไม่ใช่เส้นทางที่สัมพันธ์กันดังนั้นอาจเกิดการชน


คุณหมายถึงอะไรโดยเส้นทางญาติ
Kunok

2

อันนี้ปลอดภัยเมื่อย้ายข้อมูลและปราศจากข้อผิดพลาดซึ่งรองรับ distro ส่วนใหญ่โดยไม่คำนึงถึงรุ่น คำสั่งนี้จะสแกนไดเรกทอรีย่อยแล้วย้ายหรือคัดลอกไปยังไดเรกทอรีปลายทางใหม่ของคุณ

find . -name *.flac -exec mv '{}' "./flac/" ";"
  • รันคำสั่งนี้ที่ไดเร็กทอรีหลักที่มีไดเร็กทอรีย่อยพร้อมไฟล์ที่คุณต้องการย้าย
  • ที่ซึ่งคุณสามารถเปลี่ยน*.flacเป็นอะไรก็ได้*.zipในกรณีของคุณ หรือ*.docใช้งานส่วนขยายใดก็ได้
  • และmvเป็นคำสั่งให้ย้ายไฟล์หรือคุณสามารถใช้cpเพื่อคัดลอกข้อมูลแทนการย้าย
  • ./flac/เป็นไดเรกทอรีปลายทางที่ฉันต้องการย้ายไฟล์ FLAC ทั้งหมดไป คุณสามารถให้เส้นทางแบบเต็มได้เช่นกัน/home/myid/flac/

ตัวอย่างเต็ม (ในกรณีนี้มีหลายไดเรกทอรีย่อยที่มีชื่อศิลปินเพลงที่/home/myid/Music/แล้วไฟล์ FLAC อยู่ในระดับไดเรกทอรีย่อยที่แตกต่างกันเนื่องจากฉันไม่ต้องการโฟลเดอร์ศิลปิน แต่ต้องการมีไฟล์ FLAC ทั้งหมดในไดเรกทอรีเดียวที่/home/myid/Music/flac/

cd /home/myid/Music
mkdir flac
find . -name *.flac -exec mv '{}' "./flac/" ";"
cd flac
ls

จากนั้นจะแสดงไฟล์ FLAC ทั้งหมด


สิ่งที่ไม่;ทำอะไร?
Francesco Boi

@FrancescoBoi ต้องแน่ใจว่ารอจนกว่าคำสั่ง bash ในบรรทัดเดียวกันจะทำงานให้เสร็จ จากนั้นไปยังบรรทัดถัดไปของคำสั่ง bash สิ่งนี้มีประโยชน์สำหรับคำสั่งที่มีสคริปต์เช่น. pl หรือ python เนื่องจาก bash จะรันและจากนั้นข้ามไปยังบรรทัดถัดไปเพื่อความปลอดภัยฉันใช้; หลังจากคำสั่งที่ใช้เวลาหรือสคริปต์ในกรณีทุบตีข้ามมัน
Seandex

0

ในฐานะที่เป็นแฮ็คทุบตีคุณสามารถใช้พลังของtar:

(cd origin/;find . -exec file --mime-type "{}" \;|grep "application/zip"|cut -d ':' -f 1|xargs tar cf -)|(cd target/; tar xf -) && rm -fr origin/

นี่เป็นข้อได้เปรียบที่ไม่ได้ขึ้นอยู่กับนามสกุลของไฟล์เนื่องจากมันใช้fileคำสั่งในการเลือกไฟล์ที่จะย้ายและมันจะรักษาโครงสร้างไดเรกทอรีไว้ แต่มันจะไม่ทำงานกับพา ธ ที่มีช่องว่าง

สุดท้ายrmคือมีเพียงการลบไฟล์ต้นฉบับ (เพราะ @InquilineKea บอกว่าเขาไม่สนใจเกี่ยวกับโฟลเดอร์ต้นฉบับในความคิดเห็น)

แน่นอนว่านี่เหมาะสมอย่างยิ่งหากต้นทาง / และเป้าหมาย / โฟลเดอร์อยู่ในดิสก์ที่ต่างกัน มิฉะนั้นโซลูชันอื่น ๆ ที่เสนอจะมีประสิทธิภาพมากกว่า (แม้ว่าจะใช้หลักการตั้งชื่อแทนที่จะfileเป็นเนื้อหา)


0

สมมติว่าคุณมีเวอร์ชันของ GNU ของ find และ mv ต่อไปนี้จะมีประสิทธิภาพมากกว่าคำตอบที่มีอยู่ในการค้นหา:

find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +

การใช้+ที่ท้ายของ find -exec หมายความว่ารายการของไฟล์จะถูกส่งผ่านไปยังคำสั่ง mv แทนที่จะเรียกใช้คำสั่ง mv หนึ่งคำสั่งต่อไฟล์ที่พบ อย่างไรก็ตามข้อ จำกัด ของสิ่งนี้คือคุณสามารถวาง '{}' ที่ส่วนท้ายของคำสั่งซึ่งจำเป็นต้องใช้ตัวเลือก mv - ตัวเลือกไดเรกทอรีเป้าหมายและเท่าที่ฉันรู้ว่าเป็น GNU-ism

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