63 votes

Comment créer des liens symboliques vers tous les fichiers (classe de fichiers) d'un répertoire ?

Je voudrais créer des liens symboliques ( ln -s ) à tous les fichiers (ou une classe de fichiers, par exemple se terminant par .bar ) dans un certain répertoire. Disons que je suis dans le cwd et que je tape ls ../source/*.bar me donne

foo.bar
baz.bar

comment puis-je passer la liste des paramètres à ln -s qu'il se résout finalement à

ln -s ../source/foo.bar
ln -s ../source/baz.bar

Bien sûr je sais que je peux écrire un bash script, mais il devrait y avoir quelque chose de plus simple impliquant xargs puisque cela semble être une tâche courante - du moins pour moi.

107voto

mpy Points 24817

ln peut prendre plusieurs arguments, mais n'oubliez pas de donner un répertoire cible dans ce cas.

Donc, dans votre exemple . est le répertoire cible, donc il devrait être aussi facile que

ln -s ../source/*.bar .

En man ln ; la commande ci-dessus utilise la 3ème forme :

ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
ln [OPTION]... TARGET                  (2nd form)
ln [OPTION]... TARGET... DIRECTORY     (3rd form)
ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
  • Dans le 1er formulaire, créez un lien vers TARGET avec le nom LINK_NAME.
  • Dans le 2ème formulaire, créez un lien vers TARGET dans le répertoire courant.
  • Dans les 3ème et 4ème formulaires, créez des liens vers chaque CIBLE dans le REPERTOIRE.

8voto

kenorb Points 22006

Vous pouvez essayer de manière récursive en utilisant globstar (bash/zsh set by : shopt -s globstar ):

ls -vs ../**/*.bar .

Note : Ajouté -v pour "verbose".

Ou si la liste est trop longue, en utilisant find utilitaire :

find .. -name \*.bar -exec ln -vs "{}" dest/ ';'

Cela créera des liens dans dest/ ou le changer en . pour le dossier en cours.

5voto

justbrowsing Points 2621

Utilice find

certainDir="/path/to/dir"
find -name "*.bar" -exec ln -s {} "$certainDir" \;

N'oubliez pas non plus d'utiliser chemins complets (si possible) avec des liens symboliques.

1voto

Dmitry Points 165

cp con -s peut créer une liaison souple (ou -l pour les liens physiques).

A partir du répertoire courant peut être utilisé comme ceci :

$ cp -s ../path/with/scripts/* .

Dans votre cas, ce sera comme suit :

$ cp -s ../source/*.bar .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X