ฉันมีไฟล์. zip หลายไฟล์ในหลายไดเรกทอรี:
Fol1/Fol2
Fol3
Fol4/Fol5
ฉันจะย้ายพวกเขาทั้งหมดไปยังโฟลเดอร์ฐานทั่วไปได้อย่างไร
ฉันมีไฟล์. zip หลายไฟล์ในหลายไดเรกทอรี:
Fol1/Fol2
Fol3
Fol4/Fol5
ฉันจะย้ายพวกเขาทั้งหมดไปยังโฟลเดอร์ฐานทั่วไปได้อย่างไร
คำตอบ:
ไปที่ไดเรกทอรีระดับบนสุดของทรีที่มีไฟล์ 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
ฯลฯ เพื่อให้ทำงาน
.
เป็นนัยสำหรับ GNU แต่ไม่ใช่สำหรับคนอื่นฉันได้เพิ่มไว้อย่างชัดเจนแล้ว
หากคุณต้องการย้าย.zip
ไฟล์คุณสามารถทำสิ่งที่ต้องการ
mkdir ./zipfiles
find . -name "*.zip" -exec mv "{}" ./zipfiles \;
หากคุณใช้bashเวอร์ชัน 4 หรือสูงกว่าหรือzshคุณสามารถใช้การวนซ้ำแบบวนซ้ำได้:
mv **/*.zip /path/to/move/zip/files/to
สิ่งนี้จะย้ายเฉพาะไฟล์และไม่ใช่เส้นทางที่สัมพันธ์กันดังนั้นอาจเกิดการชน
อันนี้ปลอดภัยเมื่อย้ายข้อมูลและปราศจากข้อผิดพลาดซึ่งรองรับ 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 ทั้งหมด
;
ทำอะไร?
ในฐานะที่เป็นแฮ็คทุบตีคุณสามารถใช้พลังของ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
เป็นเนื้อหา)
สมมติว่าคุณมีเวอร์ชันของ GNU ของ find และ mv ต่อไปนี้จะมีประสิทธิภาพมากกว่าคำตอบที่มีอยู่ในการค้นหา:
find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +
การใช้+
ที่ท้ายของ find -exec หมายความว่ารายการของไฟล์จะถูกส่งผ่านไปยังคำสั่ง mv แทนที่จะเรียกใช้คำสั่ง mv หนึ่งคำสั่งต่อไฟล์ที่พบ อย่างไรก็ตามข้อ จำกัด ของสิ่งนี้คือคุณสามารถวาง '{}' ที่ส่วนท้ายของคำสั่งซึ่งจำเป็นต้องใช้ตัวเลือก mv - ตัวเลือกไดเรกทอรีเป้าหมายและเท่าที่ฉันรู้ว่าเป็น GNU-ism