# Percorso completo di un file

## FMulder

Non so se siete mai stati nella situazione di aver bisogno di una cosa talmente stupida che però non riuscite a trovare da nessuna parte...

ecco ho cercato ovunque tra forum, google e man pages ma non sono riuscito a trovare 1 soluzione  :Wink: 

come diamine faccio ad ottenere il path completo di un file? non di un eseguibile all'interno di PATH, quello lo trovo facilmente con which...

sto facendo 1 scriptino che ha bisogno del percorso completo dei file per funzionare...

grazie mille  :Wink: 

----------

## redmatrix

The magic thing is 

```
whereis nomefile
```

!!!

----------

## Ic3M4n

```
 whereis  -  locate the binary, source, and manual page files for a com-

       mand
```

non credo che sia questo che gli serve.

----------

## fedeliallalinea

C'e' anche 

```
$ locate filename
```

oppure

```
$ find . -name filename
```

----------

## FMulder

ok allora non sono io che non riuscivo a trovare 1 soluzione  :Smile: 

nessuno di questi fa quello che chiedo.. non mi serve CERCARE un file.. io so esattamente dove il file sia..

lo script che devo fare è semplicissimo, potrei anche farne a meno, ma ormai è diventata una questione di principio  :Smile: 

mi serve semplicemente per montare un'immagine iso.. ora come ora è così:

```

#!/bin/bash

umount /mnt/iso

rm ~/temp.iso # nel mio fstab /mnt/iso punta al symlink ~/temp.iso

ln -s $1 ~/temp.iso

mount /mnt/iso

```

il problema che nasce è quando io sono già nella cartella che contiene l'iso, poniamo /mnt/iso/.. se io faccio isomount file.iso ora, il file temp.iso non sarà correttamente linkato al file! avrei bisogno di dare isomount /mnt/iso/file.iso! 

Ovviamente posso passare a mano il percorso.. però mi fa inç@22are non trovare una soluzione che non sia combinare pwd, controlli vari ecc  :Smile: 

----------

## fedeliallalinea

Io non ho ancora capito... potresti rispiegarmelo, scusa

----------

## Ic3M4n

ho fatto una prova con un file che ho sull'hd e mi sembra che locate possa andare bene. nel senso:

```
locate Schermata-1.png

/home/andrea/saggio/Schermata-1.png

```

certo il nome deve essere univoco altrimenti ti molla più di un nome e lo script non puoi usarlo.

----------

## FMulder

 *fedeliallalinea wrote:*   

> Io non ho ancora capito... potresti rispiegarmelo, scusa

 

certo  :Wink: 

Io devo creare un symlink temp.iso nella home. Se sono all'interno di una directory che non sia la home, ad esempio /mnt/iso, do 

```

ln -s file.iso ~/temp.iso

```

e poi provo a fare ls -l ~/temp.iso, il link non risulterà esistente, perché cercherà il file file.iso come se fosse nella stessa directory di temp.iso!

```

23:39:29 ale@loki /mnt/iso $ ln -s file.iso ~/temp.iso

23:39:37 ale@loki /mnt/iso $ ls -l ~/temp.iso

lrwxrwxrwx  1 ale users 8 13 mag 23:39 /home/ale/temp.iso -> file.iso       <<-- sfondo rosso scuro

```

Per ottenere un symlink funzionante, dovrei quindi dare 

```

23:40:50 ale@loki ~ $ ln -s /mnt/iso/file.iso ~/temp.iso

23:40:58 ale@loki ~ $ ls -l ~/temp.iso

lrwxrwxrwx  1 ale users 17 13 mag 23:40 /home/ale/temp.iso -> /mnt/iso/file.iso 

```

Il problema è che io devo creare questo symlink in uno script, dove il file da linkare è passato come argomento quando chiamo lo script.. quindi se io do solo isomount file.iso, o anche isomount iso/file.iso (se sono in /mnt), lo script non funzionerà perché creerà un symlink sbagliato!

Il locate non può andare perché se il database non è aggiornato non trova il file..

----------

## CarloJekko

.@iceman

ma ogni volta che mette una iso nuova deve fare updatedb?  

Edit hai ragione

##Falso Cmq io ho provato lo script e funziona anche se do isomount gino.iso che stà nella cartella /home/ziopippo e io mi trovo in /home/ziopippo

----------

## FMulder

 *CarloJekko wrote:*   

> .@iceman
> 
> ma ogni volta che mette una iso nuova deve fare updatedb?  
> 
> Cmq io ho provato lo script e funziona anche se do isomount gino.iso che stà nella cartella /home/ziopippo e io mi trovo in /home/ziopippo

 

Bhe questo è ovvio, dato che il symlink cerca il file gino.iso nella stessa directory in cui è situato, cioè la home  :Wink: 

Prova a fare:

```

cd ~

mkdir temp

mv gino.iso temp

cd temp

isomount gino.iso

```

e vedrai che non funzionerà più perché non troverà più il file  :Sad: 

----------

## fedeliallalinea

Il find pero' si se sai come si chiama il file pero' la ricerca sara' lunga visto che deve passare tutte le cartelle. Oppure lanci updatedb

----------

## CarloJekko

Credo che il suo problema non sia sapere dove si trova il file ma passare allo script la posizione dello stesso ( esempio di c++ argv[ 0 ] )

----------

## FMulder

 *fedeliallalinea wrote:*   

> Il find pero' si se sai come si chiama il file pero' la ricerca sara' lunga visto che deve passare tutte le cartelle. Oppure lanci updatedb

 

no.. ho provato.. quello che restituisce è il percorso relativo alla dir dal quale lancio find...

ad esempio:

```

23:59:00 ale@loki /mnt/iso $ find . -name "file.iso"

./file.iso

```

mentre io ho bisogno di /mnt/iso/file.iso  :Sad: 

certo, potrei far partire il find da /, ma impiegherei decisamente meno a fare tutto a mano, dato che sono giusto 4 comandi, e lo stesso mi sa che vale per updatedb  :Wink: 

ormai è più che altro una questione di principio, ho fatto a meno dello script per mesi, oggi mi è venuto lo sfizio e mi sono bloccato con questo problema e non riesco a credere che non esista un comando che restituisce il percorso assoluto di un file!!!

 *CarloJekko wrote:*   

> Credo che il suo problema non sia sapere dove si trova il file ma passare allo script la posizione dello stesso ( esempio di c++ argv[ 0 ] )

 

Esatto  :Smile:  :Smile: 

----------

## CarloJekko

in c++ sarebbe uno skerzo!

----------

## fedeliallalinea

 *FMulder wrote:*   

> e lo stesso mi sa che vale per updatedb 

 

Magari con questo tip... https://forums.gentoo.org/viewtopic-t-335374.html

----------

## CarloJekko

lo sò che per principio devi riuscirci , ma magari  qui trovi qualcosa

http://www.kde-look.org/content/show.php?content=11577

----------

## grentis

Potresti fare in questo modo...non so se funziona:lol: 

controllare l'argomento passato (il file)

se inizia con / -> vuol dire che devi partire dalla root...allora usi direttamente l'argomento per creare il link (e così hai detto che funziona)

altrimenti $PWD/$1 -> il file si trova partendo dalla directory corrente PWD sommando l'argomento

Non mi viene in mente altro...    :Razz: 

----------

## FMulder

 *grentis wrote:*   

> Potresti fare in questo modo...non so se funziona:lol: 
> 
> controllare l'argomento passato (il file)
> 
> se inizia con / -> vuol dire che devi partire dalla root...allora usi direttamente l'argomento per creare il link (e così hai detto che funziona)
> ...

 

si alla fine ho fatto così infatti  :Wink: 

solo ke davvero non riesco a credere che non esista un comando banale come questo!!!

Cmq grazie a tutti per l'aiuto  :Wink: 

----------

## fedeliallalinea

 *FMulder wrote:*   

> solo ke davvero non riesco a credere che non esista un comando banale come questo!!!

 

Ma che sia banale lo dici tu... i comandi ci sono (find e locate).

----------

## redmatrix

Per creare un symlink devi specificare:

A) sorgente

B) destinazione

Per la destinazione non ci sono problemi, di fatto ln accetta qualunque path, sia relativi che assoluti.

Il tuo problema è il sorgente, come puoi pensare di dare un percorso relativo se non ti trovi nella cartella dove si trova il file e soprattutto il link deve essere creato in un'altra directory?

Mi spiace dovertelo dire ma ci hai fatto impazzire perché pensavamo fosse un problema sensato ma è una scemenza!!!

Se il link simbolico deve essere fatto in una cartella diversa da quella dove si trova il file origine il percorso completo è d'obbligo mentre se impartisci il comando da una cartella che non contiene ne il sorgente ne il link simbolico il percorso completo è d'obbligo per entrambi.

Se tu hai un file /mnt/deposito/immagine.iso e vuoi creargli un link /mnt/deposito/temp.iso il comando da dare se sei in /mnt/deposito/  è

```

ln -s immagine.iso temp.iso

```

Se invece non sei in /mnt/deposito/ è normale che tu debba dare un

```

ln -s /mnt/deposito/immagine.iso /mnt/deposito/temp.iso

```

Ora il percorso completo per il link tu lo dai gia, ovvero ~/temp.iso quindi resta da sapere, sto script da quale posizione lancia il comando???

Se lo lancia dalla cartella dove si trova la iso sorgente allora il path completo lo puoi trovare con

```

SORGENTE="$( pwd )/immagine.iso"

```

Mentre se il comando viene lanciato da una posizione casuale sei obbligato ad hardcodare il percorso del sorgente specificando direttamente dove si trova.

(Aggiunta) Oppure usi locate o qualcosa di simile per cercare di individuare il file sempre che nel filesystem non non ci siano due file con lo stesso nome.

Non prendertela se sono stato un po duro ma abbi pazienza, questi sono problemini di prima elementare!!!Last edited by redmatrix on Fri May 13, 2005 10:46 pm; edited 1 time in total

----------

## FMulder

Tranquillo redmatrix non me la prendo... se leggi bene il mio ultimo post, ho scritto che ho risolto la questione proprio come dici tu, in una maniera semplicissima... ma se leggi bene il mio primo post, noterai che la mia richiesta era semplicemente quella di trovare un comando per ottenere il path assoluto di un file, e credevo già di essere stato chiaro.. poi varie persone mi hanno richiesto spiegazioni, o hanno frainteso, e a quel punto ho dovuto spiegare tutto e come ben dici tu, si risolve facilmente con $(pwd)/$1... ma ripeto, la mia richiesta era più una questione "accademica" che altro, volevo semplicemente sapere se esisteva o meno un comando per ottenere il path assoluto di un file..

comunque se non sono stato chiaro dall'inizio e vi ho fatto perdere tempo scusatemi  :Smile: 

----------

## redmatrix

 *FMulder wrote:*   

> Tranquillo redmatrix non me la prendo... se leggi bene il mio ultimo post, ho scritto che ho risolto la questione proprio come dici tu, in una maniera semplicissima... ma se leggi bene il mio primo post, noterai che la mia richiesta era semplicemente quella di trovare un comando per ottenere il path assoluto di un file, e credevo già di essere stato chiaro.. poi varie persone mi hanno richiesto spiegazioni, o hanno frainteso, e a quel punto ho dovuto spiegare tutto e come ben dici tu, si risolve facilmente con $(pwd)/$1... ma ripeto, la mia richiesta era semplicemente di sapere se esisteva o meno un comando per ottenere il path assoluto di un file...
> 
> comunque se non sono stato chiaro dall'inizio e vi ho fatto perdere tempo scusatemi 

 

Beh, crdo di doverti delle scuse, di fatto ho iniziato a scrivere il post prima delle ultime "inserzioni" e ne ho dovuto rimandare il completamento...

Comunque il comando è pwd, ti da il percorso alla directory corrente o in alternativa puoi usare la variabile d'ambiente PWD che contiene lo stesso percorso che ottieni con il comando pwd.

Ciao.

----------

## CarloJekko

ho provato questa soluzione

generi il symlink proprio nella directory in cui ti trovi ad es /home/ziopippo/temporaneo/gino.iso /home/ziopippo/temporaneo/temp.iso

poi 

mv temp.iso /home/ziopippo

secondo me è meglio del pwd a cui avevo pensato ank'io ma ho scartato da subito perchè impiastricciava troppo...

Bonne Nuit

----------

