Puncte:0

Script Shell pentru a șterge toate fișierele de un anumit tip din foldere diferite, cu excepția celor mai recente 10

drapel eg

În primul rând, vă rog să-mi scuzați engleza mea săracă.

Încerc să scriu un script shell pentru a curăța unele fișiere de un anumit tip din folderele mele de rezervă.

Trebuie să elimin fișierele de un anumit tip, cu excepția celor mai noi 10 din fiecare folder.

Structura folderului arată astfel:

Dosarul rădăcină
â
âââ folder_1
â âââ file_1.txt
â âââ file_2.txt
â âââ file_n.txt
â
âââ folder_2
â âââ file_1.txt
â âââ file_2.txt
â âââ file_n.txt
â
âââ folder_n
â âââ file_1.txt
â âââ file_2.txt
â âââ file_n.txt
â

Am folosit scriptul de la David Foerster ca bază, dar nu își pot da seama cum să funcționeze separat în foldere diferite fără a scrie manual fiecare nume de folder în script.

În prezent, scriptul arată astfel:

găsiți /volume1/rootfolder/ -type f -name *.txt -printf '%T@ %p\0' |
sortare --zero-terminated --reverse --numeric-sort --field-separator=' ' --key 1,1 |
gawk -F ' ' -v RS='\0' -v ORS='\0' -v retain_count=10 \
  'BEGIN{ maxage = systime() - retain_younger_days * 24 * 3600; }
  (NR > retain_count) && (int($1) < maxage) { print(substr($0, length($1) + 2)); }' |
xargs -r0 -- rm --

Dar problema este că elimină toate fișierele din toate folderele, cu excepția celor mai recente 10. Deci, în general, am doar 10 fișiere în toate folderele, nu 10 în fiecare folder.

Vă rog, ajutați-mă să îmi dau seama cum să fac un script pentru a procesa fiecare folder separat.

drapel hr
Acest tip de lucru este mai ușor în `zsh`, care are calificative glob pentru selectarea fișierelor pe baza timpului de modificare. Consultați, de exemplu, [Scriptul Bash: ștergeți condiționat fișierele mai vechi, păstrând cele mai recente copii](https://askubuntu.com/a/1352544/178692) sau [Eliminați toate fișierele din directorul mai vechi decât cele mai recente zece fișiere adăugate](https: //askubuntu.com/a/930709/178692)
drapel ng
Îmi pare rău @steeldriver. Sper că nu vă deranjează întrebarea - mă gândeam de ce să nu scriu un script Python? Bash se simte problematic de întreținut uneori pentru mine (în sensul că sunt de acord cu extinderea domeniului de aplicare al soluției)... ar fi mai puțin adecvat în opinia ta personală, dacă da, de ce?
drapel hr
@brezniczky Am vrut doar să spun că este mai ușor în zsh * decât în ​​bash * - nu sunt suficient de fluent în python pentru a comenta meritele sale relative
drapel ng
@steeldriver în regulă, nu sunt - aproape evident - nu cunosc zsh, mulțumesc oricum pentru moment! poate cineva cu ambele/toate cele 3 cărți în mână să se lovească de întrebare într-o zi și să ne dea/ne răspunsul :)
Puncte:2
drapel cn

Îl împarți în două părți. În primul rând, construiți o structură de directoare și, în acest caz, avem nevoie doar de directoare care conțin fișiere. În a doua parte, sortăm mai întâi cel mai nou fișier și le omitem pe cele cu coadă.

#!/bin/bash

în timp ce IFS= citește -rd ''; do
    găsiți „$REPLY” \
    -maxdepth 1 -type f -name '*.txt' -printf '%T@\t%p\0' | sortare -zk1rn | cut -zf2- | coada -zn +$((10+1)) | xargs -r -0 echo rm
gata < <( \
    găsi $PWD/date \
    -mindepth 2 -type f -printf %h\0 | sort -zu \
)

Exista si posibilitatea de a folosi globstar cu pentru buclă:

#!/bin/bash
shopt -s globstar nullglob

pentru a în date/*/**/; do
    găsiți „$a” \
    -maxdepth 1 -type f -name '*.txt' -printf '%T@\t%p\0' | sortare -zk1rn | cut -zf2- | coada -zn +$((10+1)) | xargs -r -0 echo rm
Terminat

În cele din urmă, folosim o serie de contoare pentru a ține evidența numărului de fișiere:

#!/bin/bash

găsi $PWD/data -mindepth 1 -type f -name '*.txt' -printf '%T@\t%p\0' \
    | sortare -zk1rn | cut -zf2- \
    | awk -F / -vRS='\0' -vORS='\0' '{a=$0; NF=NF-1} b[$0]++ >= 10 {print a}' | xargs -r -0 echo rm
Nazar Tareyev avatar
drapel eg
Vă mulțumesc pentru răspuns. Ce se întâmplă dacă adâncimea directorului este mai mare de 1? Mi-am simplificat structura folderului doar pentru a-mi simplifica întrebarea. Dar structura reală a folderelor este mai profundă și nu este fixă. Uneori fișierele mele țintă se află în mai multe directoare, uneori mai multe sau mai puțin.
bac0n avatar
drapel cn
Am folosit specificatorul greșit. Puteți adăuga `-n 1` la `xargs` pentru o mai bună lizibilitate.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.