Onko tullut joskus tarvetta muuntaa hakemistollinen symlinkkejä oikeiksi tiedostoiksi, jotta voisi poistaa tiedostot niiden alkuperäisessä paikassaan? Yllättäen tätä varten piti kirjoittaa oma skripti.
Skripti on verrattaen lyhyt, joten pastean sen suoraan tähän, ja selostan sitä sitten:
#!/bin/bash
# realizes symbolic links into their flesh-and-blood counterparts
# TODO make option to use `mv' instead of `cp'
RED='\e[0;31m'
GREEN='\e[0;32m'
for f in "$@"
do
# test for symbolic
if [ -h "$f" ]; then
src=`readlink -n "$f"`
if [ ! -e "$src" ]; then
echo -e "$RED""Broken symlink: " $f
continue
fi
mv "$f" "$f"_temp
cp -r "$src" "$f"
rm -f "$f"_temp
echo -e "$GREEN""Copied" $src
fi
done
Koodi on melko tiivis, ja käyttää värejä. Väreistä on helppo luopua tyhjentämällä alussa esiintyvät vakiot. For-silmukka on tyypillinen sellainen: käymme kaikki annetut argumentit ohjelmassamme lävitse. Ongelmana onkin jälkikäteen miettiä, miten voisimme lisätä ohjelmaan esikatselun (dry-run) ja tiedostojen siirtämisen vähän vauhdittamaan operointia. Bash-koodi on sekavaa, ja kovin hyviä muistikkaita tiedostotestit eivät tarjoa. -h tarkoittaa siis symbolisen linkin varalta tarkastamista.
Näpsäkkä readlink antaa meille linkin toisen pään, ja sitten tarkastamme vielä linkin kelpoisuuden. Sitten teemme varsinaisen temppumme, eli nimeämme symlinkin uudelleen, siirrämme kaman samalle nimelle kuin mitä symblinkki edusti, ja sitten poistamme varovaisesti symlinkin. Alustavissa testailuissa homma pelasi ihan hyvin.
Kehittelyä
Tähän voisi kaveriksi lisätä tosiaan mainitsemani siirtelyvalinnat. Joku getopt auttaa asiassa. En ajatellut lähteä toteuttamaan noita. Aika paljon työtä kirjoittaa nätinoloinen runko uudestaan.