Číslo inodu pro svůj soubor můžete najít pomocí
ls -i
a
ls -l
zobrazuje počet odkazů (počet pevných odkazů na konkrétní inode)
po nalezení čísla inodu můžete vyhledat všechny soubory se stejným inodem:
find . -inum NUM
zobrazí názvy souborů pro inode NUM v aktuálním adresáři (.)
Na vaši otázku ve skutečnosti neexistuje přesně definovaná odpověď. Na rozdíl od symbolických odkazů jsou pevné odkazy k nerozeznání od „původního souboru“.
Položky adresáře se skládají z názvu souboru a ukazatele na inode. Inode zase obsahuje metadata souboru a (ukazuje na) skutečný obsah souboru). Vytvořením pevného odkazu se vytvoří další název souboru + odkaz na stejný inode. Tyto odkazy jsou jednosměrné (alespoň v typických souborových systémech) -- inode uchovává pouze počet odkazů. Neexistuje žádný vnitřní způsob, jak zjistit, které je "původní" jméno souboru.
Mimochodem, to je důvod, proč se systémové volání pro "smazání" souboru nazývá unlink
. Pouze odstraní pevný odkaz. Data inodu a připojená data jsou vymazána pouze v případě, že počet referencí inodu klesne na 0.
Jediný způsob, jak najít další odkazy na daný inode, je důkladně prohledat systém souborů a zkontrolovat, které soubory odkazují na daný inode. K provedení této kontroly můžete použít 'test A -ef B' z shellu.
UNIX má pevné odkazy a symbolické odkazy (vytvořené pomocí "ln"
a "ln -s"
respektive). Symbolické odkazy jsou jednoduše soubor, který obsahuje skutečnou cestu k jinému souboru a může křížit souborové systémy.
Pevné odkazy existují od počátků UNIXu (což si stejně pamatuji, a to už je docela dlouhá doba). Jsou to dvě položky adresáře, které odkazují na přesné stejná podkladová data. Data v souboru jsou specifikována jeho inode
. Každý soubor v souborovém systému ukazuje na inode, ale není vyžadováno, aby každý soubor ukazoval na jedinečný inode – odtud pocházejí pevné odkazy.
Protože inody jsou jedinečné pouze pro daný souborový systém, existuje omezení, že pevné odkazy musí být na stejném souborovém systému (na rozdíl od symbolických odkazů). Všimněte si, že na rozdíl od symbolických odkazů neexistuje žádný privilegovaný soubor – všechny jsou si rovny. Datová oblast bude uvolněna pouze tehdy, když vše soubory používající tento inode se smažou (a všechny procesy jej také zavřou, ale to je jiný problém).
Můžete použít "ls -i"
příkaz k získání inodu konkrétního souboru. Poté můžete použít "find <filesystemroot> -inum <inode>"
příkaz k nalezení všech souborů na souborovém systému s daným inodem.
Zde je skript, který dělá přesně to. Vyvoláte jej pomocí:
findhardlinks ~/jquery.js
a najde všechny soubory na daném souborovém systému, které jsou pevnými odkazy na tento soubor:
[email protected]:~# ./findhardlinks /home/pax/jquery.js
Processing '/home/pax/jquery.js'
'/home/pax/jquery.js' has inode 5211995 on mount point '/'
/home/common/jquery-1.2.6.min.js
/home/pax/jquery.js
Zde je skript.
#!/bin/bash
if [[ $# -lt 1 ]] ; then
echo "Usage: findhardlinks <fileOrDirToFindFor> ..."
exit 1
fi
while [[ $# -ge 1 ]] ; do
echo "Processing '$1'"
if [[ ! -r "$1" ]] ; then
echo " '$1' is not accessible"
else
numlinks=$(ls -ld "$1" | awk '{print $2}')
inode=$(ls -id "$1" | awk '{print $1}' | head -1l)
device=$(df "$1" | tail -1l | awk '{print $6}')
echo " '$1' has inode ${inode} on mount point '${device}'"
find ${device} -inum ${inode} 2>/dev/null | sed 's/^/ /'
fi
shift
done