Come creare collegamenti simbolici a tutti i file (classe di file) in una directory?


43

Vorrei creare collegamenti simbolici ( ln -s) a tutti i file (o a una classe di file, ad esempio, terminando con .bar) in una determinata directory. Dimmi che sono nel CWD e che tipo ls ../source/*.barmi dà

foo.bar
baz.bar

come posso passare l'elenco dei parametri a ln -squello che alla fine si risolve

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

Ovviamente so di poter scrivere uno script bash, ma dovrebbe esserci qualcosa di più semplice che coinvolge xargscirca, dal momento che sembra essere un compito comune - almeno per me.

Risposte:


75

ln accetta più argomenti, ma in questo caso non dimenticare di fornire una directory di destinazione.

Quindi, nel tuo esempio .è la directory di destinazione, quindi dovrebbe essere facile come

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

Da man ln; il comando sopra utilizza il 3o modulo:

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)
  • Nel primo modulo, crea un link a TARGET con il nome LINK_NAME.
  • Nel secondo modulo, creare un collegamento a TARGET nella directory corrente.
  • Nei moduli 3 ° e 4 °, creare collegamenti a ciascun OBIETTIVO in DIRECTORY.

5
Mi hai appena salvato 5 minuti solidi della mia vita, abbastanza per passare uno di loro a lasciare un commento. :-)
moodboom

Questo non funziona se non ci sono file *.bar. Creerà un collegamento con il nome "*.bar", che non è quello che desideri.
Nimrod,

1
@Nimrod: È vero, ma puoi dire a bash che vuoi invece segnalare un errore tramite shopt -s failglob; vedere ad esempio unix.stackexchange.com/a/216227/33390 (L'equivalente in zsh è setopt nomatch, che è attivato di default)
mpy

: applauso: bello!
Chris Schmitz,

3

Uso find

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

Inoltre, ricorda di utilizzare percorsi completi (ove possibile) con collegamenti simbolici.


2
Grazie, no find $certainDir -name "*.bar" -exec ln -s {} \;? E perché dovrei usare percorsi completi? Trovo abbastanza conveniente sapere che i collegamenti rimangono intatti quando sposto un albero di directory intorno a cui ci sono alcuni collegamenti interni.
Dastrobu,

Dipende da dove si desidera collegare in modo simbolico le directory. E non riesco a ricordare perché i percorsi completi siano una buona idea, potrebbe essere stato per collegamenti duri, ma l'ho bruciato nella mia mente per un motivo. Hmmm.
sopraggiunge il

Grazie, la tua risposta è fantastica. Poiché la risposta di mpy è la soluzione più semplice alla domanda, il punto va a lui / lei. Accetterei entrambe le risposte, se potessi.
Dastrobu,

3

Puoi provare ricorsivamente sia usando globstar (bash / zsh impostato da:) shopt -s globstar:

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

Nota: aggiunto -vper verbose.

O se l'elenco è troppo lungo, usando l' findutilità:

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

Ciò creerà collegamenti dest/o lo cambierà per .per la cartella corrente.


La seconda è la risposta corretta.
Nimrod,

0

cpcon l' -sopzione è possibile creare un collegamento soft (o -lper collegamenti reali).

Dalla directory corrente può essere utilizzato in questo modo:

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

Nel tuo caso sarà così:

$ cp -s ../source/*.bar .
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.