Linux ย้ายไฟล์จากไดเร็กทอรีเฉพาะหนึ่งไดเร็กทอรีขึ้นและลบโฟลเดอร์ว่าง


0

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

/Folder0/Alphabetic_folder/Folder_name/DeleteFolder

/Folder0/A/Folder1/DeleteFolder
/Folder0/B/Folder2/DeleteFolder

DeleteFolderinfoมักจะมีชื่อเดียวกันซึ่งเป็น ฉันต้องการบางสิ่งเช่น:

  1. ไปข้างในไดเรกทอรี (ตัวอักษร)
  2. สำหรับทุกโฟลเดอร์ที่เข้าไปข้างในหากมีinfoโฟลเดอร์mv *.*ไปยังโฟลเดอร์ปัจจุบันให้ลบinfo(นั่นคือmv info/* ./ && rm info:)
  3. ถ้าinfoไม่มีโฟลเดอร์ exit
  4. ย้ายไปยังโฟลเดอร์ถัดไป

ฉันแน่ใจว่านี่เป็นปัญหาเล็กน้อยของทักษะสคริปต์ แต่ทักษะสคริปต์ของฉันยังต่ำในปัญหานี้

คำตอบ:


1

UPD ที่จะทำงานได้ดีขึ้น :)

find -depth -print0 |  while read -d '' -r dir; do if [[ $dir == *info ]]; then mv "$dir"/* /tmp; rmdir "$dir"; fi; done

คำตอบเก่าที่นี่:

#!/bin/bash
cd /Folder0
for i in `ls`; do #get list of files and dirs in a folder0
    if [ -d $i ]; then #if list item is a folder
    cd $i   #then go inside (in you ex its folder A)
    for j in `ls`; do #list folders and files
            if [ -d $j ]; then #if item is folder
                    cd $j            #go inside (in your ex - Folder1)
                    mv info/* /any_folder_you_want #it will not move files if there is an error
                    rmdir info/ #it will not remove dir if it is not empty
                    cd .. #(go down)
            fi #(go to the next folder Folder2)
    done;  #end of folder A
    cd ..  #go down 
    fi     #next folder B...
done

คุณต้องเปลี่ยนส่วนที่มี mv และ rmdir เพื่อทดสอบว่าคุณได้รับผลลัพธ์ที่ถูกต้องเพียงแค่ใส่ ls และบรรทัดความคิดเห็นด้วย mv และ rmdir:

#mv info/* /any_folder_you_want #it will not move files if there is an error
ls
#rmdir info/ #it will not remove dir if it is not empty

คุณต้องเรียกใช้สคริปต์นี้นอก Folder1

คำถาม?


โฟลเดอร์ภายใน A, B, C ที่มีพื้นที่ไม่ได้รับผลกระทบ: Folder0 / A / A - คัดลอก / ข้อมูล
Michal Sapsa

ค้นหา - ความลึก -print0 | ในขณะที่อ่าน -d '' -r dir; ทำอย่างไรถ้า [[$ dir == info]]; จากนั้น mv "$ dir" / / tmp; rmdir "$ dir"; Fi; เสร็จแล้ว
Gena Gordeev

/ tmp ควรเป็น "$ dir /../" จากนั้นก็ใช้งานได้ตามที่ควร ขอบคุณสำหรับความช่วยเหลือ
Michal Sapsa

1

สมมติว่าการค้นหาสำหรับไดเรกทอรีอัลฟาทั้งหมดจากไดเรกทอรีการทำงาน:

dirs=$(find [a-z][A-Z]* -type d -name info) 
for f in $dirs; do echo "$f/*" done     # first test it works to requirements

for f in $dirs; do mv "$f/*" "$f"/..; rmdir "$f"; done # working version with mv and rmdir
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.