Nalezení nejnovějších adresářů

Dennis Fridrich

Nalezení nejnovějších adresářů
« kdy: 04. 04. 2013, 14:55:33 »
Ahoj,

poradi mi nekdo, jak vyresit tento problem v unixu?

Mam deset slozek
a1, a2, a3, a4, a5, a6, a7, a8, a9, a10

Potrebuju najit pet nejnovejsich a vsechny ostatni smazat, tzn. vysledek bude:
a6, a7, a8, a9, a10 - tyhle slozky zustanou

Asi to bude pres nejaky find... exec {} ale neprisel jsem na to jak :-(
« Poslední změna: 04. 04. 2013, 18:22:21 od Petr Krčmář »


Logik

  • *****
  • 1 031
    • Zobrazit profil
    • E-mail
Re:find shell
« Odpověď #1 kdy: 04. 04. 2013, 15:57:00 »
ls -lt | tail -n 5

Logik

  • *****
  • 1 031
    • Zobrazit profil
    • E-mail
Re:find shell
« Odpověď #2 kdy: 04. 04. 2013, 15:58:44 »
Teda samozřejmě

rm -r `ls -lt | tail -n 5`

a ještě by to chtělo zajistit, že tam bude určitě těch deset souborů, nebo místo tail udělat

awk ' BEGIN {n=0; }
{if(n++ >= 5) print $0 } '

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Nalezení nejnovějších adresářů
« Odpověď #3 kdy: 04. 04. 2013, 18:38:49 »
Tak to asi nebude to prave orechove. On to chce nejnovejsi ve smyslu poradi cisla ve jmenu souboru. Takze by se to muselo sortovat ne podle casu, ale podle jmena souboru, coz pujde blbe, protoze ta cisla jsou nekdy jednomistna a nekdy dvojmistna. a10 tak vyjde pred a5. Samozrejme, lze predpokladat, ze asi poradi casu modifikace bude odpovidat poradi cisla adresare. Krome toho, rm -r `ls -lt | tail -n 5` smaze pet nejnovejsich a necha ty starsi, coz je presne opak toho, co chce.

Logik

  • *****
  • 1 031
    • Zobrazit profil
    • E-mail
Re:Nalezení nejnovějších adresářů
« Odpověď #4 kdy: 04. 04. 2013, 19:25:12 »
Pokud podle čísla, tak

awk '{ print substr($0,2), $0 }' | sort -n | awk ' if(NR>5) {print $2 }'




student

Re:Nalezení nejnovějších adresářů
« Odpověď #5 kdy: 04. 04. 2013, 20:00:04 »
sort -n mi tu nefunguje, tak sa da pouzit nieco ako
Kód: [Vybrat]
ls | sort -V | head -n -5 | xargs -I{} rmdir "{}"
Pre zmazanie zloziek, co nieco obsahuju upravit na rm -r.
Pozor na netradicne nazvy suborov - ked niekoho napadne dat tam newline, tak to tiez nebude fungovat.

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Nalezení nejnovějších adresářů
« Odpověď #6 kdy: 04. 04. 2013, 20:55:45 »
Tedy, nic ve zlem, ale i kdyz nejsem v bashi tak uplne kovany, tak mam pocit, ze s timto zadanim a tak blbymi nazvy adresaru to jednim radkem moc nepujde. Bude to chtit par radku skriptu tak se dvema cykly. Jednim, kde se najde nejvetsi cislo N za pismenem "a" ve vypisu adresaru, druhy, ktery z vypisu adresaru smaze vse, pokud to neni aN, a(N-1),... a(N-5). Kdybych nebyl liny nebo to potreboval, tak bych to nejak zbastlil. Ale vy byste se mi smali, ze umite v bashi lepe. :-)

Logik

  • *****
  • 1 031
    • Zobrazit profil
    • E-mail
Re:Nalezení nejnovějších adresářů
« Odpověď #7 kdy: 05. 04. 2013, 14:34:05 »
JardaP: Na mym řešení je něco špatně (proč pak nenapíšeš co, bychom to opravili?), nebo není na jeden řádek (neumím počítat?), anebo jsi ani nečetl co napsali lidé před tebou a hned tvrdíš, že to nelze?

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Nalezení nejnovějších adresářů
« Odpověď #8 kdy: 05. 04. 2013, 19:09:00 »
Problem bude asi v tom, ze kazdy chapeme problem jinak. Ty ho chapes tak, ze mas adresare a1 az a10 a mas vymazat pet nejstarsich. V tom pripade ale nechapu, proc si lamat hlavu a vubec vznaset dotaz, kdyz staci napsat rm se seznamem adresaru a1 az a5.

Ja problem chapu tak, ze mam seznam adresaru s inkrementujicim cislem, ktery muze treba i byt ruzne dlouhy a muze zacinat a koncit jinymi cisly, nez 1 a 10, seznam v zadani je pouze prikladem. Treba je bude nejaky cron kazdy den vytvaret a jednou za tyden se vymazou, krome peti nejnovejsich. S konstantou 5 to pak asi nebude moc fungovat.

Asi by bylo vhodne, kdyby to tazatel upresnil, aby bylo jasne, kdo z nas to blbe pochopil.


Re:Nalezení nejnovějších adresářů
« Odpověď #10 kdy: 06. 04. 2013, 11:17:07 »
ls | sort -Vr | tail -n +6
alebo
ls -vr | tail -n +6
vratia zoznam zloziek na vymazanie

Logik

  • *****
  • 1 031
    • Zobrazit profil
    • E-mail
Re:Nalezení nejnovějších adresářů
« Odpověď #11 kdy: 06. 04. 2013, 11:26:53 »
Ne, problém je v tom, že evidentně vůbec nerozumíš tomu, co ten můj IMHO dosti jednoduchý skript dělá. Pouze moje první verze mazala pět z deseti a proto jsem hned do toho postu napsal alternativu pro případ, kdy těch adresářů může být kolik chce. Další varianta napsaná na Tvoji (jedinou vcelku rozumnou) námitku, že "nejnovější" má být dle čísla a ne dle času modifikace také řeší obecný případ s libovolným počtem adresářů.

Jediné, co jsem zatím neřešil je variabilní délka nenumerického prefixu (o které jsi se ovšem až doteď nezmínil a kterou jsi si vymyslel až teď, abys ospravedlnil to své "nejde)... o které v zadání nebylo ani ň. Pokud ale neumíš vyřešit ani takovejdle jednoduchej úkol, jako najít první číslo v řetězci, tak např. nahraď první awk v mém řešení tímto:

sed -r 's/^(([^0-9])*([0-9]*).*)$/\3 \1/'

Ještě máš nějakej problém?

PS: Omlouvám se za poněkud útočnej tón, ale poněkud mi vadí, když se snaží radit člověk, kterej to buďto vůbec neumí a/nebo vůbec nečte to, co psali lidi před nim - a radí blbě a ještě ani neumí uznat chybu...



Logik

  • *****
  • 1 031
    • Zobrazit profil
    • E-mail
Re:Nalezení nejnovějších adresářů
« Odpověď #12 kdy: 06. 04. 2013, 11:37:25 »
... Předchozí post platil Jardovi.

Jinak doplnění - jak tady už psali jiní, tam kde je k dispozici sort/ls s parametrem v/V (natural sort), tak je to řešení opravdu ještě jednoduchý, tak jak ho tady napsali rooobertek a naznačil student (ten taky nepočítal s variabilním počtem adresářů). Teď koukám, že i na tom stroji kde nemám sort s -V tak ls parametr v má (vzhledem k tomu, jak starí je tam instalace, tak teda bude asi všude), ten jsem neznal, tak díky za doplnění a za dobrej tip.