25. maaliskuu 2011, 18:35

Symlinkit oikeiksi tiedostoiksi

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.

Tageja: , ,

---
---

---

Aiheen vierestä