Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/10/2008, à 16:43

abelthorne

[résolu] Transformer un lien symbolique en fichier réel ?

Bonjour,
Dans un dossier, j'ai des fichiers et des liens symboliques sur les fichiers en question. Je voudrais transformer ces liens symboliques en copies réelles des fichiers (concrètement, supprimer le lien et faire une copie du fichier source sur le nom que le lien avait).

Est-ce qu'il y aurait un script Nautilus ou un logiciel qui me permettrait de faire cela (en mode graphique) ?

Dernière modification par abelthorne (Le 06/10/2008, à 23:40)

Hors ligne

#2 Le 06/10/2008, à 16:49

iuchiban

Re : [résolu] Transformer un lien symbolique en fichier réel ?

double clique sur le lien
copier le fichier
flèche retour arrière
coller le fichier
supprimer le lien
tongue

je vois que ça pour le moment, mais certainement que d'autres idées vont arriver  big_smile


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#3 Le 06/10/2008, à 16:53

abelthorne

Re : [résolu] Transformer un lien symbolique en fichier réel ?

Le problème, c'est que j'en ai quelques dizaines à traiter (dans un thème d'icônes, donc des dossiers qui peuvent contenir plusieurs centaines de fichiers). D'où la recherche d'une solution de type "batch graphique" qui m'éviterait de perdre des heures à les traiter un par un.

Hors ligne

#4 Le 06/10/2008, à 17:03

Math

Re : [résolu] Transformer un lien symbolique en fichier réel ?

ça se rapproche de l'idée de iuchiban ; mais avec truc genre

tar -xcf /le_dossier/sous-dossier/

; du coup il va récupérer et recréer récursivement toute l'arbo lors de la décompression.

Hors ligne

#5 Le 06/10/2008, à 17:12

abelthorne

Re : [résolu] Transformer un lien symbolique en fichier réel ?

Je ne pige pas bien ce qu'est censée faire cette commande ? Si je comprends bien, ça crée une archive et la désarchive à la volée ? Si c'est bien le cas :
- logiquement, ça va garder les liens symboliques tels quels, non ?
- si ça vire les liens symboliques en les remplaçant par leur fichier source, c'est là que ça devient rigolo : je ne veux pas transformer tous les liens dans mes dossiers, seulement certains ; si je transforme tous les liens, il faudra que j'en recrée les trois-quarts, ce qui ne m'arrange pas dans ma recherche de simplicité et d'efficacité.

Idéalement, ce dont j'aurais besoin se présenterait sous la forme d'une entrée "transformer ce(s) lien(s)" dans le menu contextuel de Nautilus : je sélectionne un ou plusieurs fichiers dans un dossier, j'affiche le menu contextuel, je sélectionne "transformer ce(s) lien(s)" et ça me "convertit" les fichiers sélectionnés.

Dernière modification par abelthorne (Le 06/10/2008, à 17:12)

Hors ligne

#6 Le 06/10/2008, à 22:57

BorX

Re : [résolu] Transformer un lien symbolique en fichier réel ?

Y'a qu'à demander big_smile
Lance ça :

cat > ~/".gnome2/nautilus-scripts/Transformer ces liens.sh" <<EOF 
#!/bin/bash
# Pour chaque paramètre
for lien in "\$@"; do
        # S'il s'agit d'un lien symbolique
        if [ -L "\$lien" ]; then
                # On définit la cible du lien
                orig="\$(readlink \$lien)"
                # On efface le lien
                rm "\$lien"
                # On copie la cible du lien à l'endroit du lien
                cp "\$orig" "\$lien"
        fi
done
EOF
chmod 700 ~/".gnome2/nautilus-scripts/Transformer ces liens.sh"

Et apparaitra dans ton menu contextuel "Scripts" la commande "Transformer ces liens.sh" qui n'agit que sur les liens symboliques pour les remplacer par leurs cibles respectives.
Tu peux en traiter plusieurs d'un coup...

A vot'service ! tongue

[edit]Rajout des commentaires dans le code[/edit]

Dernière modification par BorX (Le 06/10/2008, à 23:03)

Hors ligne

#7 Le 06/10/2008, à 23:17

abelthorne

Re : [résolu] Transformer un lien symbolique en fichier réel ?

Ça marche pas. hmm

Lorsque j'applique le script sur un ou plusieurs liens sélectionné(s), rien ne se passe.

Ça fait bien dix ans que je n'ai pas fait de script bash et je ne vois pas trop ce qui peut clocher. C'est normal le point-virgule entre le if et le then ?

Dernière modification par abelthorne (Le 06/10/2008, à 23:20)

Hors ligne

#8 Le 06/10/2008, à 23:28

BorX

Re : [résolu] Transformer un lien symbolique en fichier réel ?

abelthorne a écrit :

Ça marche pas. hmm

Lorsque j'applique le script sur un ou plusieurs liens sélectionné(s), rien ne se passe.

Es-tu sûr que les liens ne se transforment pas en fichiers normaux ?
A première vue, rien ne change... mais en pratique, les liens sont censés devenir leurs cibles, tout en gardant leurs noms.

abelthorne a écrit :

Ça fait bien dix ans que je n'ai pas fait de script bash et je ne vois pas trop ce qui peut clocher. C'est normal le point-virgule entre le if et le then ?

vi tongue

Hors ligne

#9 Le 06/10/2008, à 23:33

BorX

Re : [résolu] Transformer un lien symbolique en fichier réel ?

$ ls -l # Avant exécution du script dans Nautilus
total 8
drwx------ 2 borx borx 4096 2008-10-06 23:31 ./
drwx------ 4 borx borx 4096 2008-10-06 23:29 ../
lrwxrwxrwx 1 borx borx    9 2008-10-06 23:31 a -> ../orig/a
lrwxrwxrwx 1 borx borx    9 2008-10-06 23:31 b -> ../orig/b
lrwxrwxrwx 1 borx borx    9 2008-10-06 23:31 c -> ../orig/c
[borx@hpborx ~/essai/links]$ ls -l # Après exécution du script dans Nautilus sur a et c
total 16
drwx------ 2 borx borx 4096 2008-10-06 23:32 ./
drwx------ 4 borx borx 4096 2008-10-06 23:29 ../
-rw------- 1 borx borx   42 2008-10-06 23:32 a
lrwxrwxrwx 1 borx borx    9 2008-10-06 23:31 b -> ../orig/b
-rw------- 1 borx borx   54 2008-10-06 23:32 c

Hors ligne

#10 Le 06/10/2008, à 23:35

abelthorne

Re : [résolu] Transformer un lien symbolique en fichier réel ?

BorX a écrit :

Es-tu sûr que les liens ne se transforment pas en fichiers normaux ?
A première vue, rien ne change... mais en pratique, les liens sont censés devenir leurs cibles, tout en gardant leurs noms.

Oui : les icônes gardent l'emblème symlink qui montrent que ce sont des liens (et leurs propriété aussi).

Par contre, en faisant des tests en bash, si je tape des commandes du style :
lien=truc.svg
echo $lien => truc.svg (ok)
echo "$lien" => truc.svg (ok aussi)
echo "\$lien" => $lien (pas du tout ok)

Ça ne viendrait pas que dans le script le symbole $ est "échappé" ? Est-ce qu'il ne faudrait pas que le vire les antislahes (à moins qu'un script se comporte différemment de commandes simples tapées en bash l'une après l'autre) ?

EDIT : oups, j'ai pigé ! les antislashes étaient là pour échapper les $ dans le cat, mais moi j'ai juste fait un copier-coller du script dans un fichier.
Je vais les virer.

EDIT 2 : et donc, le script marche. Merci ! smile

Dernière modification par abelthorne (Le 06/10/2008, à 23:42)

Hors ligne

#11 Le 06/10/2008, à 23:40

BorX

Re : [résolu] Transformer un lien symbolique en fichier réel ?

abelthorne a écrit :

Ça ne viendrait pas que dans le script le symbole $ est "échappé" ? Est-ce qu'il ne faudrait pas que le vire les antislahes (à moins qu'un script se comporte différemment de commandes simples tapées en bash l'une après l'autre) ?

arf... J'ai cherché à faire les choses trop bien hmm
Il n'y a qu'à copier en brut dans une console le texte que j'ai fourni pour que le script soit créé au bon endroit avec les bons droits de sorte qu'il apparaisse dans le menu cool
J'ai fait ça au cas où tu ne connaîtrais rien au bash, mais finalement j'ai compliqué les choses big_smile

Si tu veux, voilà le script final :

#!/bin/bash
# Pour chaque paramètre
for lien in "$@"; do
        # S'il s'agit d'un lien symbolique
        if [ -L "$lien" ]; then
                # On définit la cible du lien
                orig="$(readlink $lien)"
                # On efface le lien
                rm "$lien"
                # On copie la cible du lien à l'endroit du lien
                cp "$orig" "$lien"
        fi
done

Hors ligne

#12 Le 06/10/2008, à 23:42

abelthorne

Re : [résolu] Transformer un lien symbolique en fichier réel ?

Ouaip, c'est bon, je (re)confirme que ça marche. smile

Hors ligne

#13 Le 06/10/2008, à 23:43

BorX

Re : [résolu] Transformer un lien symbolique en fichier réel ?

abelthorne a écrit :

EDIT : oups, j'ai pigé ! les antislashes étaient là pour échapper les $ dans le cas, mais moi j'ai juste fait un copier-coller du script dans un fichier.
Je vais les virer.

EDIT 2 : et donc, le script marche. Merci ! smile

abelthorne a écrit :

Ça fait bien dix ans que je n'ai pas fait de script bash

Bah tu vois ça revient vite !! wink

Hors ligne

#14 Le 07/08/2011, à 16:55

nono313

Re : [résolu] Transformer un lien symbolique en fichier réel ?

Bonjour,
Je suis intéressé par votre script mais je n'arrive pas à l'utilser.
Lorsque je l'execute simplement sur un de mes liens, j'obtiens ça :

./script.sh Deux\ mots
readlink: opérande supplémentaire «mots»
Saisissez « readlink --help » pour plus d'informations.

J'ai essayer en mettant le nom entre "" ou en échapant l'espace comme si-dessus et j'ai toutjours la même chose : le lien est simplement supprimé.
Une fois ce problème reglé, j'aimerais appliquer le script à tout les liens présents dans un dossier mais je ne sais pas comment faire. roll

Merci d'avance pour vos réponses.

Hors ligne

#15 Le 07/08/2011, à 20:07

abelthorne

Re : [résolu] Transformer un lien symbolique en fichier réel ?

Je sais plus si c'est celui-là mais on m'avait proposé des scripts qui s'utilisaient avec Nautilus : sélection des fichiers -> clic droit -> choix du script -> opération sur tous les fichiers concernés.

Pas de problème pour les espaces dans les noms de fichiers mais il faudrait retrouver le message concerné si c'est pas ce script...

Hors ligne

#16 Le 08/08/2011, à 10:51

BorX

Re : [résolu] Transformer un lien symbolique en fichier réel ?

Yop,

Le script amélioré :

#!/bin/bash
# Pour chaque paramètre
for lien in "$@"; do
  # S'il s'agit d'un lien symbolique
  [ -L "$lien" ] && {
    # On se positionne dans le répertoire du lien (pour gérer les liens pointant vers des chemins relatifs)
    cd "$(dirname "$lien")"
    # On ne se soucie désormais que du nom du lien
    lien="$(basename "$lien")"
    # On définit la cible du lien
    orig="$(readlink "$lien")"
    # On efface le lien
    rm "$lien"
    # On copie la cible du lien à l'endroit du lien
    cp "$orig" "$lien"
    # On revient au répertoire précédent
    cd - >/dev/null
  }
done

Pour l'appliquer sur tous les liens symboliques d'un répertoire :

find le/path/vers/le/repertoire/ -type l -print0 | xargs -r0t /tmp/script.sh

Dernière modification par BorX (Le 08/08/2011, à 10:53)

Hors ligne

#17 Le 08/08/2011, à 11:02

BorX

Re : [résolu] Transformer un lien symbolique en fichier réel ?

Allez, bonus :
Pour les liens morts (qui pointent vers une cible inexistante), ne touche pas au lien (et le laisse donc mort).
Pour les liens pointant vers des répertoires, copie intégralement le répertoire cible (liens symboliques inclus).

#!/bin/bash
replaceLinkByTarget() {
    # On se positionne dans le répertoire du lien (pour les liens pointant vers des chemins relatifs)
    cd "$(dirname "$lien")"

    # On ne se soucie désormais que du nom du lien
    lien="$(basename "$lien")"

    # On définit la cible du lien
    orig="$(readlink "$lien")"

    # Si le lien pointe vers une cible inexistante
    [ -e "$orig" ] || return 1;

    # On efface le lien
    rm "$lien"

    # On copie la cible du lien à l'endroit du lien
    cp -a "$orig" "$lien"

    # On revient au répertoire précédent
    cd - >/dev/null
}

# Pour chaque paramètre
for lien in "$@"; do
  # S'il s'agit d'un lien symbolique
  [ -L "$lien" ] && replaceLinkByTarget "$lien";
done

Dernière modification par BorX (Le 08/08/2011, à 11:05)

Hors ligne