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.