Comment créer un lien symbolique entre chacun des fichiers d'un répertoire et un autre répertoire?

15

Si j'ai un répertoire /foocontenant quelques fichiers, comment créer un lien symbolique pour chaque entrée /foovers /bar/?

Par exemple, si /fooa les fichiers a, bet c, je veux créer trois liens symboliques:

  • /bar/a -> /foo/a
  • /bar/b -> /foo/b
  • /bar/c -> /foo/c
Steven
la source
Êtes-vous sûr de ne pas simplement vouloir créer un lien symbolique vers foo?
Rich Bradshaw
L'application réelle de ceci est que j'ai installé un programme et que je voudrais déplacer ses exécutables vers un dossier standard dans mon $ PATH plutôt que d'ajouter celui installé au chemin.
Steven
Il semble que ce serait une meilleure idée de simplement le configurer avec --prefix=.
Hello71

Réponses:

18

Vous pouvez utiliser (GNU) cpavec l' --symbolic-linkoption:

prompt$ mkdir foo
prompt$ cd foo
prompt$ touch a b c
prompt$ mkdir ../bar
prompt$ cd ../bar
prompt$ cp --symbolic-link ../foo/* .
prompt$ ls -l
total 0
lrwxrwxrwx. 1 hlovdal hlovdal 8 Jun 12 16:24 a -> ../foo/a
lrwxrwxrwx. 1 hlovdal hlovdal 8 Jun 12 16:24 b -> ../foo/b
lrwxrwxrwx. 1 hlovdal hlovdal 8 Jun 12 16:24 c -> ../foo/c
prompt$
hlovdal
la source
Cela semble être exactement la solution. Impressionnant!
Steven
C'est très parfait.
noraj
un moyen de faire en sorte que cela s'applique également aux répertoires? Lorsque j'exécute ceci, j'obtiens un avertissement "cp: omettant le répertoire './baz'"
solidau
15

Essayez ceci:

ln -s /foo/* /bar

Le répertoire source, comme spécifié dans la question, est /foo. Notez qu'il doit être entièrement spécifié (c'est-à-dire en commençant par le répertoire racine), donc d'autres exemples ressembleraient à ceci:

ln -s /some/dir/with/baz/* destdir
ln -s /dir/to/link/from/* /dir/to/link/to
ln -s $PWD/stuff/* more/stuff
En pause jusqu'à nouvel ordre.
la source
ça marche même?
ctrlc-root
@ root.ctrlc: Vous devez spécifier le chemin complet de la source (qui se trouve /dans ma réponse d'origine). J'ajouterai une précision.
pause jusqu'à nouvel ordre.
Je pense que si vous voulez tout copier en tant que lien symbolique avec une seule commande, vous devez utiliser des cp -s comme @hlovdal answer, cp -rs /var/www/folder/ .copie tous les fichiers de sous-dossiers en tant que lien symbolique, pas comme ln -s /var/www/folder/ .qui a dupliqué les fichiers de sous-dossiers sur mon ordinateur.
baptx
2

Quelque chose comme ça?

cd /foo
for f in *; do ln -s $PWD/$f /bar; done
garyjohn
la source