เชลล์สคริปต์เพื่อย้ายไฟล์ทั้งหมดจากโฟลเดอร์ย่อยไปยังโฟลเดอร์หลัก


47

ฉันได้รวมโฟลเดอร์ไว้ในโฟลเดอร์Aแล้ว Aฉันต้องการที่จะย้ายไฟล์จากโฟลเดอร์เหล่านั้นทั้งหมด

หรือ

ฉันต้องการตัดไฟล์ทั้งหมดจากโฟลเดอร์ย่อยและวางในโฟลเดอร์หลัก

ทำอย่างไร


1
ฉันยังไม่ได้ทดสอบสิ่งนี้ว่าจะเข้าใจผิดหรืออะไรก็ตาม แต่คุณลองป้อนคำสั่งนี้จาก Folder A ในเทอร์มินัล mv */* .หรือไม่?
Marty Fried

คุณแน่ใจหรือว่าไม่มีชื่อไฟล์ที่ซ้ำกัน?
jippie

mv */* .จะไม่ย้ายไฟล์จากโฟลเดอร์ย่อย
ราหุล Virpara

@ jippie ใช่ไม่มีชื่อที่ซ้ำกัน
Rahul Virpara

คำตอบ:


81

ไปที่Aไดเรกทอรีของคุณและเรียกใช้

find . -mindepth 2 -type f -print -exec mv {} . \;

ซึ่งหมายความว่า "ค้นหาไฟล์ทั้งหมดในไดเรกทอรีนี้และไดเรกทอรีย่อยและดำเนินการ mv กับไดเรกทอรีเป้าหมายสำหรับแต่ละไฟล์ที่พบเพื่อย้ายไฟล์ไปยังไดเรกทอรีปัจจุบัน


1
นอกจากนี้ยังพยายามย้ายไฟล์ที่อยู่ในไดเรกทอรีหลักแล้ว
ราหุล Virpara

virpara: ตอนนี้รุ่นของคุณลืมทุกไฟล์ในไดเรกทอรี. dot แก้ไขด้วย -mindepth 2 แทนที่จะระงับคำเตือน
Tuminoid

1
ด้วย GNU findคุณสามารถเพิ่มความสง่างามและไม่ใช้mvกระบวนการสำหรับแต่ละไฟล์:find A -mindepth 2 -type f -exec mv -t A \{\} +
David Foerster

เดวิดเวอร์ชันของคุณทำงานได้จนกว่าคุณจะถึงขีดจำกัดความยาวบรรทัดคำสั่งสูงสุดซึ่งไม่ยากเลยที่จะหาวิธีพิมพ์เส้นทางโดยเฉพาะในกรณีที่คุณเรียกใช้จากไดเรกทอรีอื่นที่ไม่ใช่ A เช่นในตัวอย่างของคุณ
Tuminoid

9
มันอันตรายมาก หากคุณมีไฟล์ที่มีชื่อไฟล์เหมือนกันในโฟลเดอร์ย่อยที่แตกต่างกันคุณจะเขียนทับไฟล์เหล่านี้ทั้งหมดด้วยการค้นหาครั้งล่าสุด ดีกว่าที่จะใช้ mv กับfind . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
--backup

4

คุณสามารถสร้างไฟล์และตั้งชื่อมันว่า "cutme" (เพื่อสร้างไฟล์ชื่อ cutme ในประเภทเทอร์มินัลnano cutmeหากต้องการบันทึกให้กด CTRL + X จากนั้นกด ENTER) ตัวอย่างเช่นและวางต่อไปนี้โดยสมมติว่า:

  1. คุณต้องการทำสิ่งนี้ซ้ำ ๆ (ในโฟลเดอร์ย่อยและโฟลเดอร์ย่อยของโฟลเดอร์ย่อยเหล่านั้น)
  2. คุณต้องการข้ามการย้ายไฟล์สคริปต์
  3. คุณมีสิทธิ์ในการย้ายไฟล์ในโฟลเดอร์นั้น
  4. ไฟล์อาจมีหรือไม่มีช่องว่างในชื่อของพวกเขา

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

หมายเหตุชื่อcutmeภายในบรรทัด ควรเหมือนกับสคริปต์ที่คุณจะเรียกใช้

หลังจากสร้างไฟล์และวางบรรทัดด้านบนให้รันต่อไปนี้ในโฟลเดอร์เดียวกับสคริปต์:

chmod +x cutme. นี้จะให้ไฟล์ใหม่ของคุณ "ปฏิบัติการ" ./cutmeธงเพื่อให้คุณสามารถดำเนินการได้เช่นนี้


เหตุใดฉันจึงควรลองย้ายไฟล์ที่อยู่ในไดเรกทอรีหลักแล้ว
ราหุล Virpara

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