Score:0

เชลล์สคริปต์เพื่อลบไฟล์บางประเภทในโฟลเดอร์ต่างๆ ยกเว้น 10 ไฟล์ล่าสุด

ธง eg

ก่อนอื่น โปรดแก้ตัวภาษาอังกฤษที่ไม่ค่อยดีของฉัน

ฉันกำลังพยายามเขียนเชลล์สคริปต์เพื่อล้างไฟล์บางไฟล์บางประเภทในโฟลเดอร์สำรองของฉัน

ฉันต้องการลบไฟล์บางประเภท ยกเว้น 10 ไฟล์ใหม่ล่าสุดในแต่ละโฟลเดอร์

โครงสร้างโฟลเดอร์มีลักษณะดังนี้:

โฟลเดอร์รูท
â
âââ โฟลเดอร์_1
â âââ file_1.txt
â âââ file_2.txt
â âââ file_n.txt
â
âââ โฟลเดอร์_2
â âââ file_1.txt
â âââ file_2.txt
â âââ file_n.txt
â
âââ folder_n
â âââ file_1.txt
â âââ file_2.txt
â âââ file_n.txt
â

ฉันใช้สคริปต์จาก เดวิด ฟอสเตอร์ เป็นพื้นฐาน แต่ไม่สามารถหาวิธีทำให้มันทำงานในโฟลเดอร์ต่าง ๆ แยกกันโดยไม่ต้องเขียนชื่อแต่ละโฟลเดอร์ด้วยตนเองในสคริปต์

ขณะนี้สคริปต์มีลักษณะดังนี้:

ค้นหา /volume1/rootfolder/ -type f -name *.txt -printf '%T@ %p\0' |
sort --ศูนย์สิ้นสุด --reverse --numeric-sort --field-separator=' ' --key 1,1 |
เพ่งพิศ -F ' ' -v RS='\0' -v ORS='\0' -vtain_count=10 \
  'เริ่มต้น{ maxage = systime() -tain_younger_days * 24 * 3600; }
  (NR > Retain_count) && (int($1) < maxage) { พิมพ์(substr($0, ความยาว($1) + 2)); }' |
xargs -r0 -- rm --

แต่ปัญหาคือมันลบทุกไฟล์ทุกโฟลเดอร์ ยกเว้น 10 ล่าสุด โดยรวมแล้วฉันมีเพียง 10 ไฟล์ในทุกโฟลเดอร์ ไม่ใช่ 10 ไฟล์ในแต่ละโฟลเดอร์

โปรดช่วยฉันหาวิธีสร้างสคริปต์เพื่อประมวลผลแต่ละโฟลเดอร์แยกกัน

hr flag
สิ่งนี้จะง่ายกว่าใน `zsh` ซึ่งมีตัวระบุแบบกลมสำหรับเลือกไฟล์ตามเวลาที่แก้ไข ดูตัวอย่าง [สคริปต์ Bash: ลบไฟล์เก่าแบบมีเงื่อนไขในขณะที่เก็บสำเนาล่าสุด](https://askubuntu.com/a/1352544/178692) หรือ [ลบไฟล์ทั้งหมดภายในไดเรกทอรีที่เก่ากว่าสิบไฟล์ที่เพิ่มล่าสุด](https: //askubuntu.com/a/930709/178692)
ng flag
ขออภัย @steeldriver ฉันหวังว่าคุณจะไม่รังเกียจคำถามนี้ - ฉันแค่คิดว่าทำไมไม่เขียนสคริปต์ Python Bash รู้สึกว่ามีปัญหาในการบำรุงรักษาในบางครั้งสำหรับฉัน (ซึ่งฉันเห็นด้วยกับการขยายขอบเขตสำหรับการแก้ปัญหา)... ความเห็นส่วนตัวของคุณจะไม่เพียงพอหรือไม่ หากเป็นเช่นนั้น เพราะเหตุใด
hr flag
@brezniczky ฉันแค่หมายความว่ามันง่ายกว่าใน zsh *มากกว่าใน bash* - ฉันไม่คล่องพอที่จะใช้ python เพื่อแสดงความคิดเห็นเกี่ยวกับข้อดีของมัน
ng flag
@steeldriver เอาล่ะ ฉัน - เกือบจะเห็นได้ชัดว่าไม่คุ้นเคยกับ zsh ขอบคุณสำหรับตอนนี้! อาจมีคนที่มีไพ่ทั้ง 3 ใบในมือชนกันในคำถามสักวันหนึ่งและให้คำตอบฉัน/เรา :)
Score:2
ธง cn

คุณแบ่งเป็นสองส่วน อันดับแรก คุณต้องสร้างโครงสร้างไดเร็กทอรี และในกรณีนี้ เราต้องการเพียงไดเร็กทอรีที่มีไฟล์เท่านั้น ในส่วนที่สอง เราจัดเรียงไฟล์ใหม่ล่าสุดก่อนและข้ามไฟล์เหล่านั้นด้วย หาง.

#!/bin/bash

ในขณะที่ IFS= อ่าน -rd ''; ทำ
    ค้นหา "$ตอบกลับ" \
    -maxความลึก 1 -type f -name '*.txt' -printf '%T@\t%p\0' | จัดเรียง -zk1rn | ตัด -zf2- | หาง -zn +$((10+1)) | xargs -r -0 echo rm
เสร็จแล้ว < <( \
    ค้นหา $PWD/ข้อมูล \
    -ความลึกขั้นต่ำ 2 -ประเภท f -printf %h\0 | เรียงลำดับ -zu \
)

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

#!/bin/bash
shopt -s globstar nullglob

สำหรับ a ใน data/*/**/; ทำ
    ค้นหา "$a" \
    -maxความลึก 1 -type f -name '*.txt' -printf '%T@\t%p\0' | จัดเรียง -zk1rn | ตัด -zf2- | หาง -zn +$((10+1)) | xargs -r -0 echo rm
เสร็จแล้ว

สุดท้าย เราใช้อาร์เรย์ของตัวนับเพื่อติดตามจำนวนไฟล์:

#!/bin/bash

ค้นหา $PWD/data -minความลึก 1 -type f -name '*.txt' -printf '%T@\t%p\0' \
    | จัดเรียง -zk1rn | ตัด -zf2- \
    | awk -F / -vRS='\0' -vORS='\0' '{a=$0; NF=NF-1} b[$0]++ >= 10 {พิมพ์ a}' | xargs -r -0 echo rm
Nazar Tareyev avatar
eg flag
ขอบคุณสำหรับการตอบกลับ จะเกิดอะไรขึ้นถ้าความลึกของไดเร็กทอรีมากกว่า 1 ฉันลดความซับซ้อนของโครงสร้างโฟลเดอร์เพื่อให้คำถามง่ายขึ้น แต่โครงสร้างโฟลเดอร์จริงนั้นลึกกว่าและไม่ได้รับการแก้ไข บางครั้งไฟล์เป้าหมายของฉันอยู่ภายใต้ไดเร็กทอรีหลายไดเร็กทอรี บางครั้งก็มากหรือน้อย
bac0n avatar
cn flag
ฉันใช้ตัวระบุที่ไม่ถูกต้อง คุณสามารถเพิ่ม `-n 1` ใน `xargs` เพื่อให้อ่านง่ายขึ้น

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา