Je snadné převést symbolický odkaz na pevný odkaz pomocí ln -f
(příklad)
Také by bylo snadné převést pevný odkaz (názvy souborů link
a original
) zpět na symbolický odkaz na link->original
v případě, že znáte oba soubory a sami si určíte, který z nich je „původní soubor“. Můžete snadno vytvořit jednoduchý skript convert-known-hardlink-to-symlink
výsledkem by bylo něco jako:
convert-known-hardlink-to-symlink link original
$ ls -li
3802465 lrwxrwxrwx 1 14 Dec 6 09:52 link -> original
3802269 -rw-rw-r-- 1 0 Dec 6 09:52 original
Ale bylo by opravdu užitečné, kdybyste měli skript, kde byste mohli definovat pracovní adresář (výchozí ./
) a vyhledávací adresář, kde hledat (výchozí /
) pro soubory se stejným inodem a poté převeďte všechny tyto pevné odkazy na symbolické odkazy.
Výsledkem by bylo, že v definovaném pracovním adresáři jsou všechny soubory, které jsou pevnými odkazy, nahrazeny symbolickými odkazy na první nalezený soubor se stejným inodem.
Začátek by byl find . -type f -links +1 -printf "%i: %p (%n)n"
Přijatá odpověď:
Vytvořil jsem skript, který to udělá. Skript převede všechny pevné odkazy, které najde ve zdrojovém adresáři (první argument), které jsou stejné jako v pracovním adresáři (volitelný druhý argument), na symbolické odkazy:
https://gist.github.com/rubo77/7a9a83695a28412abbcd
Má volbu -n pro běh nasucho, která nedělá nic, ale ukazuje, co by se udělalo.
Hlavní část:
$WORKING_DIR=./
#relative source directory from working directory:
$SOURCE_DIR=../otherdir/with/hard-links/with-the-same-inodes
# find all files in WORKING_DIR
cd "$WORKING_DIR"
find "." -type f -links +1 -printf "%i %pn" |
while read working_inode working_on
do
find "$SOURCE_DIR" -type f -links +1 -printf "%i %pn" | sort -nk1 |
while read inode file
do
if [[ $inode == $working_inode ]]; then
ln -vsf "$file" "$working_on"
fi
done
done
Odkazy +1 –> Najdou všechny soubory, které mají VÍCE než 1 odkaz. Soubory s pevným odkazem mají počet odkazů alespoň dva.