stat -c "%A %h %n" /usr/* | grep ^d | sort -k2,2n | tail -1 | cut -d" " -f3-
Už zde bylo uvedeno, že můžeme vyjít z počtu hardlinků, protože hardlink na adresář nedokážeme explicitně vytvořit. Vytvoříme ho jedině implicitně tím, že ten adresář vytvoříme (dva hardlinky - jeden kvůli odkazu z rodičovského adresáře, druhý kvůli odkazu na sebe sama přes tečku) nebo v něm vytvoříme podadresář (za každý podadresář jeden hardlink kvůli adresáři ..).
Jediný problém je, odkud vzít data, abychom měli počet hardlinků, jméno souboru a také informaci o tom, jestli jde o adresář nebo ne. ls není vhodné kvůli zarovnávání mezerami, protože pak nedokážeme získat nepoškozené jméno souboru. Ale můžeme použít stat, kde si oddělovače můžeme zvolit podle svého a pokud umístíme název do posledního sloupečku, dokážeme ho snadno vytáhnout pomocí sloupečku 3-.
| 2 | No.2 Revision |
stat -c "%A %h %n" /usr/* | grep ^d | sort -k2,2n | tail -1 | cut -d" " -f3-
Už zde bylo uvedeno, že můžeme vyjít z počtu hardlinků, protože hardlink na adresář nedokážeme explicitně vytvořit. Vytvoříme ho jedině implicitně tím, že ten adresář vytvoříme (dva hardlinky - jeden kvůli odkazu z rodičovského adresáře, druhý kvůli odkazu na sebe sama přes tečku) nebo v něm vytvoříme podadresář (za každý podadresář jeden hardlink kvůli adresáři ..).
Jediný problém je, odkud vzít data, abychom měli počet hardlinků, jméno souboru a také informaci o tom, jestli jde o adresář nebo ne. ls není vhodné kvůli zarovnávání mezerami, protože pak nedokážeme získat nepoškozené jméno souboru. Ale můžeme použít stat, kde si oddělovače můžeme zvolit podle svého a pokud umístíme název do posledního sloupečku, dokážeme ho snadno vytáhnout pomocí sloupečku 3-.
Pro zájemce: Tento skript by měl dát správné řešení i pro případ souborů, které mají v názvu \n. Zdůrazňuji, že do papírových testů toto řešení není potřeba, tam úplně stačí jednoduché řešení uvedené na začátku tohoto příspěvku. Jde skutečně jen o variantu pro perfekcionisty.
#!/bin/bash
max_links=0
max_name=
for name in *
do
if [ -d "$name" ]
then
links=`stat -c "%h" "$name"`
if [ $max_links -lt $links ]
then
max_links=$links
max_name=$name
fi
fi
done
echo "$max_name"
| 3 | No.3 Revision |
stat -c "%A %h %n" /usr/* | grep ^d | sort -k2,2n | tail -1 | cut -d" " -f3-
Už zde bylo uvedeno, že můžeme vyjít z počtu hardlinků, protože hardlink na adresář nedokážeme explicitně vytvořit. Vytvoříme ho jedině implicitně tím, že ten adresář vytvoříme (dva hardlinky - jeden kvůli odkazu z rodičovského adresáře, druhý kvůli odkazu na sebe sama přes tečku) nebo v něm vytvoříme podadresář (za každý podadresář jeden hardlink kvůli adresáři ..).
Jediný problém je, odkud vzít data, abychom měli počet hardlinků, jméno souboru a také informaci o tom, jestli jde o adresář nebo ne. ls není vhodné kvůli zarovnávání mezerami, protože pak nedokážeme získat nepoškozené jméno souboru. Ale můžeme použít stat, kde si oddělovače můžeme zvolit podle svého a pokud umístíme název do posledního sloupečku, dokážeme ho snadno vytáhnout pomocí sloupečku 3-.
Pro zájemce: Tento skript by měl dát správné řešení i pro případ souborů, které mají v názvu \n. Zdůrazňuji, že do papírových testů toto řešení není potřeba, tam úplně stačí jednoduché řešení uvedené na začátku tohoto příspěvku. Jde skutečně jen o variantu pro perfekcionisty.
#!/bin/bash
max_links=0
max_name=
for name in *
* .*
do
if ! [ "." == "$name" ]
then
if ! [ ".." == "$name" ]
then
if [ -d "$name" ]
then
links=`stat -c "%h" "$name"`
if [ $max_links -lt $links ]
then
max_links=$links
max_name=$name
fi
fi
fi
fi
done
echo "$max_name"
(Takhle do mnoha IFů je to rozepsané proto, aby se mi to lépe ladilo.)
(Navíc tu mám zohlednění i skrytých podadresářů, to papírová úloha myslím také nepožaduje. Kdyby požadovala, musel by se ze statu výše odfiltrovat "podadresář" .., který fakticky podadresářem není.)
Copyright students of FIT CTU and others, 2014. Content on this site is licensed under a Creative Commons Attribution-ShareAlike 4.0 International license.