Problème avec la commande ln -s

Résolu/Fermé
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 - 17 mars 2019 à 02:25
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 - 17 mars 2019 à 12:31
Bonjour,

Je cherche à créer des liens symboliques pour tous les fichiers/dossiers contenus dans un dossier.

La commande suivante me donne la liste des fichiers/dossiers :
ls -Q /home/barnabe0057/torrents | grep -v "meta"

Mais dès que je rajoute la création de liens :
ls -Q /home/barnabe0057/torrents | grep -v "meta" | ln -s -t /home/barnabe0057/done

J'obtiens une erreur :
ln: missing file operand
Try 'ln --help' for more information.


Merci d'avance pour votre aide.



Configuration: Win 7 Pro SP1 64bits
Athlon X4 750K Quad Core
8 Go DDR3 1866 Mhz

1 réponse

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
17 mars 2019 à 10:42
Salut,

Ça ne marche pas comme ça ;-(

Tu dois te servir de la commande
find
et de son option
-exec
ou passer sa sortie à
xargs
, sans compter qu'il vaut mieux éviter de travailler sur la sortie de la commande
ls
;-(

Est-ce que les fichiers à exclure (meta dans ton exemple) c'est leur nom complet ou ils contiennent le motif "meta" ?

Sinon une commande dans ce genre devrait faire le job :

find /home/barnabe0057/torrents/* -name done -prune -o \( \! -name 'meta' \) -exec ln -vs {} /home/barnabe0057/done/ \; 


Mais avant de la lancer tel quel, si le motif à exclure est bien "meta", lance d'abord :

find /home/barnabe0057/torrents/* -name done -prune -o \( \! -name 'meta' \)


Et vois si la sortie te convient en terme de fichiers remontés.
0
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
Modifié le 17 mars 2019 à 11:34
Merci pour ta réponse, les fichiers à exclure ont l'extension .meta

En lançant la deuxième commande j'obtiens la liste complète, les fichiers ne sont pas exclus.
De plus concernant les dossiers, j'obtiens leur contenu (alors que je voudrais juste un lien vers le dossier) et je ne pense pas que cela soit nécessaire.

Aurais-tu une autre idée ?

J'avais essayé aussi avec une boucle FOR mais j'avais un problème avec la variable $item (espaces dans les noms de fichiers) alors que la sortie de la commande LS est correcte si exécutée seule :
for item in `ls /home/barnabe0057/torrents | grep -v "meta"`;do echo "$item";done
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024
17 mars 2019 à 11:43
Essaie ça :
find /home/barnabe0057/torrents/* -maxdepth 0 -name done -prune -o \( \! -name '*.meta' \)

Si la liste est bonne, on rajoutera la fin de la commande…
0
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
Modifié le 17 mars 2019 à 12:06
J'ai l'impression que c'est bon cette fois, il n'y a plus de récursivité et les fichiers meta sont bien exclus.

J'ai juste peur pour les espaces dans les noms de fichiers.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024
17 mars 2019 à 12:14
T'inquiètes pas pour les espaces ;-))

Rajoutes
-exec ln -vs {} /home/barnabe0057/done/ \; 
à ta commande, ce qui donnera :
find /home/barnabe0057/torrents/* -maxdepth 0 -name done -prune -o \( \! -name '*.meta' \) -exec ln -vs {} /home/barnabe0057/done/ \;


En guise d'exemple :

$ tree
.
├── bar1.meta
├── bar2.meta
├── bar3.meta
├── fich1
├── fich2
├── fich3
├── mon fich # fichier avec un espace
├── rep
└── rep2
├── fich4
├── fich5
└── fich6

2 directories, 10 files

$ find /home/jp/trash/* -maxdepth 0 -name rep -prune -o \( \! -name '*.meta' \) -exec ln -vs {} /home/jp/trash/rep/ \;
'/home/jp/trash/rep/fich1' -> '/home/jp/trash/fich1'
'/home/jp/trash/rep/fich2' -> '/home/jp/trash/fich2'
'/home/jp/trash/rep/fich3' -> '/home/jp/trash/fich3'
'/home/jp/trash/rep/mon fich' -> '/home/jp/trash/mon fich'
'/home/jp/trash/rep/rep2' -> '/home/jp/trash/rep2'

$ tree
.
├── bar1.meta
├── bar2.meta
├── bar3.meta
├── fich1
├── fich2
├── fich3
├── mon fich
├── rep
│   ├── fich1 -> /home/jp/trash/fich1
│   ├── fich2 -> /home/jp/trash/fich2
│   ├── fich3 -> /home/jp/trash/fich3
│   ├── mon fich -> /home/jp/trash/mon fich
│   └── rep2 -> /home/jp/trash/rep2
└── rep2
├── fich4
├── fich5
└── fich6

3 directories, 14 files
0
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
17 mars 2019 à 12:31
Parfait ça a très bien fonctionné !

Je te remercie beaucoup pour ton aide et ton efficacité.

Bon dimanche et à bientôt.
0