Je souhaite créer des liens symboliques (ln -s
) vers tous les fichiers (ou une classe de fichiers, par exemple se terminant par .bar
) dans un certain répertoire. Dites que je suis dans le cwd et tapez ls ../source/*.bar
me donne
foo.bar
baz.bar
comment puis-je passer la liste de paramètres à ln -s
qu'il résout finalement
ln -s ../source/foo.bar
ln -s ../source/baz.bar
Bien sûr, je sais que je peux écrire un script bash, mais il devrait y avoir quelque chose de plus simple impliquant xargs
ou à peu près, car cela semble être une tâche courante - du moins pour moi.
ln
prend plusieurs arguments, mais n'oubliez pas de donner un répertoire cible dans ce cas.
Donc, dans votre exemple, .
est le répertoire cible, il devrait donc être aussi simple que
ln -s ../source/*.bar .
De 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 premier 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 actuel.
- Dans les 3ème et 4ème formulaires, créez des liens vers chaque cible dans le répertoire.
Utilisez find
certainDir="/path/to/dir"
find -name "*.bar" -exec ln -s {} "$certainDir" \;
N'oubliez pas non plus d'utiliser des chemins complets (si possible) avec des liens symboliques.
Vous pouvez essayer de manière récursive en utilisant globstar (bash/zsh défini par: shopt -s globstar
):
ls -vs ../**/*.bar .
Remarque: Ajout de -v
pour verbose.
Ou si la liste est trop longue, utilisez l'utilitaire find
:
find .. -name \*.bar -exec ln -vs "{}" dest/ ';'
Cela créera des liens dans dest/
ou le changera en .
pour le dossier actuel.
cp
avec l'option -s
peut créer un lien symbolique (ou -l
pour les liens physiques).
À partir du répertoire courant peut être utilisé comme ceci:
$ cp -s ../path/with/scripts/* .
Dans votre cas ce sera comme ça:
$ cp -s ../source/*.bar .