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/03/2017, à 09:33

DonutMan75

[RESOLU] [SHELL] Lien symbolique et wildcard

Bonjour,
j'ai un dossier ./A rempli de millier de fichiers et je souhaiterais faire des liens symboliques de *certains* de ces fichiers et les placer dans un répertoire B...

J'ai tenté un :

$ ln -vs ./A/*2014* -t ./B

Mon répertoire B contient des liens symboliques des bons fichiers.... mais j'ai l'impression qu'ils pointent vers eux-même

$ head ./B/essai2014.txt
head: cannot open `./B/essai2014.txt' for reading: Too many levels of symbolic links

J'ai l'impression que je permute des arguments, pourtant la syntaxe est bien ln -s FICHIER_SOURCE FICHIER_DESTINATION... Et l'option -t permet, si je comprends bien, de spécifier un répertoire de sortie plutôt qu'un fichier de destination...

Qu'en pensez-vous ?

Merci d'avance

Dernière modification par DonutMan75 (Le 06/03/2017, à 09:39)

Hors ligne

#2 Le 06/03/2017, à 09:38

DonutMan75

Re : [RESOLU] [SHELL] Lien symbolique et wildcard

Bonjour,
je viens de résoudre de moi-même mon problème...
En testant un peu, le problème s'est résolu de lui-même en utilisant des *chemins absolus*.
D'un point de vue général, c'est certes préférable de toujours utiliser les chemins absolus...
Dans ce cas précis en revanche, si quelqu'un peut m'expliquer pourquoi chemin absolu ==> ça marche et chemin relatif ==> ça marche pas, je sèche un peu ^^

Bon lundi à tous et à bientôt !

Donut

Hors ligne

#3 Le 06/03/2017, à 10:00

pingouinux

Re : [RESOLU] [SHELL] Lien symbolique et wildcard

Bonjour,
En faisant la même chose que toi, j'obtiens

$ ls -l ./B/essai2014.txt
lrwxrwxrwx 1 user user 17 Mar  6 09:47 ./B/essai2014.txt -> ./A/essai2014.txt

c'est-à-dire que le lien pointe vers

./B/A/essai2014.txt

qui n'existe pas.

Pour obtenir ton message d'erreur, je pense que tu as lancé d'autres commandes que tu n'as pas montrées.

Hors ligne

#4 Le 06/03/2017, à 10:21

Bougron

Re : [RESOLU] [SHELL] Lien symbolique et wildcard

En détails

u16041@u16041:~$ ln -vs ./A/*2014* -t ./B
ln: impossible d'accéder à './B': Aucun fichier ou dossier de ce type
u16041@u16041:~$ mkdir B
u16041@u16041:~$ ln -vs ./A/*2014* -t ./B
'./B/F2014.txt' -> './A/F2014.txt'
'./B/H2014.txt' -> './A/H2014.txt'
u16041@u16041:~$ head ./B/F2014.txt
head: impossible d'ouvrir './B/F2014.txt' en lecture: Aucun fichier ou dossier de ce type
u16041@u16041:~$ 

Essaies donc de cette façon

ln -rvs ./A/*2014* -t ./B
'./B/F2014.txt' -> '../A/F2014.txt'
'./B/H2014.txt' -> '../A/H2014.txt'
u16041@u16041:~$ pg ./B/*
F
H    

Dernière modification par Bougron (Le 06/03/2017, à 10:28)

Hors ligne

#5 Le 07/03/2017, à 16:07

DonutMan75

Re : [RESOLU] [SHELL] Lien symbolique et wildcard

Bonjour à tous,
avant tout merci beaucoup pour vos messages smile

Pingouinux, j'ai repris mon message et je me suis aperçu (en effet) d'une légère différence entre ce que j'avais fait et ce que j'ai écrit.
Dans mon cas, le répertoire de sortie ./B était un sous-répertoire de ./A

Dans les deux cas (./B sous-répertoire de A ou non) le problème vient des chemins relatifs.
Dans mon cas, je créais ainsi un lien symbolique "2014.txt" dans B qui pointait vers "./2014.txt" (chemin relatif dans A) : du coup ça donnait un lien qui pointait vers lui-même !

Bougron, je n'ai pas d'option -r avec mon ln. Peut-être n'utilisons nous pas la même version de ln ? Cette option est sensé faire quoi ?

$ ln --version
ln (GNU coreutils) 8.13

En tout cas merci encore pour vos réponses détaillées smile

Bonne fin de journée

Donut

Hors ligne

#6 Le 07/03/2017, à 16:11

Bougron

Re : [RESOLU] [SHELL] Lien symbolique et wildcard

Bonjour

u16041@u16041:~$ ln --help
Utilisation : ln [OPTION]... [-T] TARGET LINK_NAME   (1er format)
         ou : ln [OPTION]... TARGET                  (2e format)
         ou : ln [OPTION]... TARGET... DIRECTORY     (3e format)
         ou : ln [OPTION]... -t DIRECTORY TARGET...  (4e format)
Dans le 1er format, créer un lien vers TARGET avec le nom LINK_NAME.
Dans le 2e format, créer un lien vers TARGET dans le répertoire actuel.
Dans les 3e et 4e formats, créer des liens vers chaque TARGET dans DIRECTORY.
Créer des liens directs par défaut et des liens symboliques avec --symbolic.
Par défaut, aucune destination (nom ou nouveau lien) ne devrait encore exister.
À la création de liens directs, chaque TARGET doit exister. Les liens
symboliques peuvent contenir un texte arbitraire ; s'il est résolu par la suite,
un lien relatif est interprété comme une relation avec son répertoire parent.

Les arguments obligatoires pour les options longues le sont aussi pour les
options courtes.
      --backup[=CONTROL]      archiver chaque fichier de destination existant
  -b                          identique à --backup mais n'accepte pas d'argument
  -d, -F, --directory         permettre au superutilisateur de créer des liens
                                directs (hard) sur des répertoires (échouera
                                probablement en raison de restrictions système
                                même pour le superutilisateur)
  -f, --force                 supprimer les fichiers de destination existants
  -i, --interactive           demander s'il faut supprimer les destinations
  -L, --logical               déréférencer les TARGETs qui sont des liens
                                symboliques
  -n, --no-dereference        traiter LINK_NAME comme un fichier normal s'il
                                s'agit d'un lien symbolique vers un répertoire
  -P, --physical              transformer les liens directs en liens symboliques
  -r, --relative              créer des liens symbolique relatifs à
                                l'emplacement du lien

  -s, --symbolic              créer un lien symbolique au lieu d'un lien direct
  -S, --suffix=SUFFIX         écraser le suffixe d'archivage habituel
  -t, --target-directory=DIRECTORY  indiquer le DIRECTORY dans lequel créer
                                les liens
  -T, --no-target-directory   toujours traiter LINK_NAME comme un fichier normal
  -v, --verbose               afficher le nom de chaque fichier lié
      --help     afficher l'aide et quitter
      --version  afficher des informations de version et quitter

Le suffixe d'archive est « ~ », sauf s'il est définit autrement avec --suffix ou
SIMPLE_BACKUP_SUFFIX. La méthode du contrôle de version peut être sélectionnée
par l'option --backup ou par la variable d'environnement VERSION_CONTROL.
Les valeurs possibles sont les suivantes :

  none, off       ne jamais archiver (même si --backup est utilisée)
  numbered, t     effectuer des archives numérotées
  existing, nil   numéroter si des archives numérotées existent déjà, se
                    comporter comme « simple » dans le cas contraire
  simple, never   effectuer toujours des archives simples

L'utilisation de -s ignore -L et -P. Autrement, la dernière option indiquée
contrôle le comportement lorsqu'une TARGET est un lien symbolique, utilisant
-P par défaut.

Aide en ligne de GNU coreutils : <http://www.gnu.org/software/coreutils/>
Signalez les problèmes de traduction de « ln » à : <traduc@traduc.org>
Full documentation at: <http://www.gnu.org/software/coreutils/ln>
or available locally via: info '(coreutils) ln invocation'
u16041@u16041:~$

Hors ligne