Newsgroup: it.comp.os.linux.iniziare
Titolo: Script per creazione link simbolici

 
Ho una directory che contiene un generico progetto diciamo:
------------------
prova-links$ tree
.
├── a
│   ├── a.txt
│   └── i.jpg
├── b
│   ├── b.txt
│   └── i.jpg
├── c
│   ├── c.txt
│   └── i.jpg
├── d
│   ├── d.txt
│   └── i.jpg
├── e
│   ├── e.txt
│   └── i.jpg
├── f
│   ├── f.txt
│   └── i.jpg
├── img
├── makelinks.sh
└── txt
 
8 directories, 13 files
------------------------
 
Quindi abbiamo delle subdir che contengono file di testo
e immagini.
 
Poi abbiamo due subdir vuote: "txt" e "img".
In queste due voglio creare dei link simbolici:
 
- la dir "txt": conterrà i link ai file di testo
 
- la dir "img": conterrà i link alle immagini
 
 
Sto facendo qualche prova buttando giù un piccolo
script basato su:
 
find qualcosa | while read file; crea il link.
 
Mi chiedevo se aveste qualche soluzione da confrontare.
Grazie!  :)


cd txt
ln -s ../[a-f]/*.txt .
 
Non so se funziona, non ho provato, potrebbe anche... :-)
 
Nello script, invece di "cd", meglio forse "push" e "pop".
 
In generale, se la struttura non e` troppo complicata,
"find" potrebbe essere un po' eccessivo.
 
bye,
 
-- 
 
piergiorgio

 - la dir "img": conterrà i link alle immagini
 
Ok, ho buttato giù quanto segue.
Testato sembra funzionare...
C'era un modo un po' più semplice che avete sulla
punta dei polpatrelli?
 
_____________________________
 
prova-links$ cat makelinks.sh
----------
#!/bin/sh
 
TXTDIR=txt
IMGDIR=img
 
find ./ -iname "*.txt" -type f -exec ln -s "{}" $TXTDIR \;
find ./ \( -iname "*.jpg" -o -iname "*.png" -o -iname "*.jpeg" \) \
         -type f -exec ln -s "{}" $IMGDIR \;
--------------------------------------------------------------------
 
 
Ecco il risultato di un "tree":
-------------------------------
├── img
│   ├── a.jpeg -> ./a/a.jpeg
│   ├── a.jpg -> ./a/a.jpg
│   ├── a.png -> ./a/a.png
│   ├── b.jpeg -> ./b/b.jpeg
│   ├── b.jpg -> ./b/b.jpg
│   ├── b.png -> ./b/b.png
│   ├── c.jpeg -> ./c/c.jpeg
│   ├── c.jpg -> ./c/c.jpg
│   ├── c.png -> ./c/c.png
│   ├── d.jpeg -> ./d/d.jpeg
│   ├── d.jpg -> ./d/d.jpg
│   ├── d.png -> ./d/d.png
│   ├── e.jpeg -> ./e/e.jpeg
│   ├── e.jpg -> ./e/e.jpg
│   ├── e.png -> ./e/e.png
│   ├── f.jpeg -> ./f/f.jpeg
│   ├── f.jpg -> ./f/f.jpg
│   └── f.png -> ./f/f.png
│
└── txt
    ├── a.txt -> ./a/a.txt
    ├── b.txt -> ./b/b.txt
    ├── c.txt -> ./c/c.txt
    ├── d.txt -> ./d/d.txt
    ├── e.txt -> ./e/e.txt
    └── f.txt -> ./f/f.txt
---------------------------
 

 "find" potrebbe essere un po' eccessivo.
 
Dai un'occhiata alla soluzione che ho postato se puoi,
ho usato il find.

 ho usato il find.
 
Sembra OK (anche se non capisco bene l'output
di "tree").
 
La soluzione piu` semplice e` senza "find", come
scritto prima.
 
ln -s [a-z]*/*.txt Txt # Nota maiuscole / minuscole
ln -s [a-z]*/*.{jpg,jpeg,JPG,JPEG,png,PNG} Img
 
Il problema, e` avere i folder target (Txt e Img)
non espandibili.
Oppure un folder sopra, cioe`:
 
ln -s */*.txt ../txt
 
bye,
 
-- 
 
piergiorgio

 Testato sembra funzionare...
 
Cosa succede se lo fai partire due volte?
 
bye,
 
-- 
 
piergiorgio

 ln -s */*.txt ../txt
 
Eh no... non mi garba... vorrei avere le dir txt e img
allo stesso livello delle altre dirs di lavoro.
 
Va bè grazie mille degli spunti, faccio qualche prova
e riferisco.

 e riferisco.
 
Prego.
 
bye,
 
-- 
 
piergiorgio

 Le sposti dopo (mv).
 
Ma i links simbolici così creati non funzionano, nè sopra,
nè dopo il mv:
 
puntano a:
 
a/a.txt
b/b.txt
 
funzionerebbero solo se si trovassero dentro la stessa dir
di lavoro
 
/tmp/prova-links/a.txt -> a/a.txt
 
ti torna?
Se li piazzi dentro la dir "txt", non funzionano più,
indipendentemente da dove questa è collocata...
Funzionano zolo se stanno nella stessa dir in cui
stanno le dir a b c d...
Non so se mi sono spiegato. Comunque fai prestissimo 
a fare una prova:
 
mkdir -p /tmp/prova-link/{a,b,txt}
cd /tmp/prova-link
touch a/a.txt b/b.txt
 
 
Guarda per il momento la soluzione con find è
funzionante, per cui la tengo come base di partenza.
Anch'essa è piuttosto funambolica comunque, perchè
anche lì l'indirizzo del file originale relativo
al path del link l'ho ottenuto con la strana stringa:
 
."{}"
 
per niente elegante... ma alla fine funziona.
 
Non ti nego che mi piacerebbe capire perchè il
sistema con le varie wildcard s'inceppa...
Magari ne riparliamo dopo quelche googolata.
 
Ciao

 sistema con le varie wildcard s'inceppa...
 
Perche` si inceppa?
"*" espande tutto, quindi se hai gia` file o
folder, vengono messi in lista anche questi.
 
Stai attento che anche "find" non e` detto
sia meglio...
 
bye,
 
-- 
 
piergiorgio

 sia meglio...
 
Alla fine ho provato la soluzione con find,
perchè ha la verifica dell'esistenza del file
a cui creare il link già di serie: nel senso che
filtra già i file che esistono (che poi sono
quelli che effettivamente trova).
Inoltre è più versatile perchè posso filtrare i
file da linkare sulla base del loro nome, oppure
evitare di linkare a certi file che nel nome
contengono un certo pattern.
 
Per quale motivo hai qualche dubio su find?
 
Ad ogni modo per completezza:
https://unix.stackexchange.com/questions/410834/multiple-symlinks-by-wildcard-ln-s-txt-txt
 

 
https://unix.stackexchange.com/questions/410834/multiple-symlinks-by-wildcard-ln-s-txt-txt
 
 
Thanks,
 
bye,
 
-- 
 
piergiorgio