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í.)