web-dev-qa-db-fra.com

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

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.

35
dastrobu

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.
67
mpy

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.

3
justbrowsing

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.

3
kenorb

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 .
0
cy8g3n