Portál AbcLinuxu, 10. května 2025 13:30

Dotaz: Script - Shell

23.5.2009 14:55 Jakub Balín
Script - Shell
Přečteno: 615×
Odpovědět | Admin

Měl bych následující prosbu. Potřebuji vytvořit script v Shellu s následujícími parametry. Script, který jako parametr dostane jméno uživatele najde všechny soubory (na všech připojených discích), které uživateli patří, spočte jejich celkovou délku a spočte počet i-nodes, které uživatel zabírá. Z těchto souborů následně sestaví seznam, kde bude vždy uveden na prvním místě adresář (včetně plné cesty) a dále odsazeně seznam souborů, které v daném adresáři jsou a patří uživateli.

Můžete mi prosím někdo poradit? Děkuji

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

23.5.2009 15:33 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Script - Shell
Odpovědět | | Sbalit | Link | Blokovat | Admin
No a jak jste s tím úkolem zatím daleko? Už umíte alespoň nalézt všechny soubory které uživateli patří? A na jakou známku aspirujete? :)
23.5.2009 15:37 KubajzBalík
Rozbalit Rozbalit vše Re: Script - Shell

Jsem úplný laik takže neumím zhola nic 8o((

23.5.2009 23:29 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Script - Shell
No pokud bych se snažil dodržet zadání tak jak je napsáno (možná ne tak jak je myšleno) tak celkovou velikost by mohlo být snadné zjistit
find / -type f -user "$1" -print0 | du -c --files0-from -
jak s těmi inody to už mne nic jednoduchého nenapadá, ale asi bude nějaká utilita co zjistí počet inodů které patří uživateli i když to by asi nebylo přesně to co je myšleno :)

a ten výpis adresářů třeba takto:
find / -user "$1" | xargs -I {} dirname "{}" | sort | uniq > /tmp/list.tmp
while read; do echo $REPLY; find $REPLY -user "$1"; | xargs -n 1 -I {} echo -e "\t{}"; echo; done < /tmp/list.tmp
no nevypadá to úplně triviálně, asi budete muset také přidat ruku k dílu a napsat to nějak lépe...
23.5.2009 23:32 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Script - Shell
oprava
while read; do echo $REPLY; find $REPLY -user "$1"; | xargs -n 1 -I {} echo -e "\t{}"; echo; done < /tmp/list.tmp
na
while read; do echo $REPLY; find $REPLY -user "$1" | xargs -n 1 -I {} echo -e "\t{}"; echo; done < /tmp/list.tmp
23.5.2009 23:43 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Script - Shell
A samozřejmě to můžete spojit, to já si to jen zkoušel
find / -user "$1" | xargs -I {} dirname "{}" | sort | uniq | while read; do echo $REPLY; find $REPLY -user "$1" | xargs -n 1 -I {} echo -e "\t{}"; echo; done
ať se v tom pokud možno nikdo nevyzná ;)
23.5.2009 23:07 chearius | skóre: 7 | blog: /dev/chearius | Heidelberg
Rozbalit Rozbalit vše Re: Script - Shell
Odpovědět | | Sbalit | Link | Blokovat | Admin

Prvni cast zadani se da vyresit pomoci prikazu find (viz man find). Volba -user zajisti vypsani souboru pro zadaneho uzivatele, pro vypsani souboru je treba jeste volba -type f. Velikost souboru se da zjistit pomoci prikazu ls -l soubor, vyfiltrovanim napr. pomoci awk (viz man awk) a ulozenim do promene. Kazdy soubor zabira 1 inode, takze pro pocet inodu staci akorat spocitat pocet souboru vracenych prikazem find.

Zkuste se mrknout do tech manualovych stranek a vymyslet, jak by ten skript mel presneji fungovat. Kdyz narazite na problem, jsem si jisty, ze se tady na abclinuxu najde dostatek lidi, kteri vam jej radi pomohou vyresit.

23.5.2009 23:12 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: Script - Shell
Na zistenie veľkosti bude možno jednoduchšie použiť stat -c "%s"
23.5.2009 23:40 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Script - Shell
pro pocet inodu staci akorat spocitat pocet souboru vracenych prikazem find

Nojo, ale hardlinkované soubory vám find najde jako dva... to byste musel ještě kontrolovat kolik je na daný inode linků (ukáže třeba ls -l).

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.