script Bash per la creazione di collegamenti simbolici

2

Sono relativamente nuovo a bash e sto avendo qualche problema con uno script che sto cercando di scrivere. Dopo aver passato l'ultima ora o più alla ricerca e alla sperimentazione di nuove tecniche, non riesco ancora a fare ciò che vorrei.

Il mio obiettivo è questo: ho una cartella /Volumes/Server\ RAID/Photos dove tengo tutte le mie foto. Ogni cartella è denominata YYYY-MM FolderName dove a volte ci sono spazi in FolderName . All'interno di queste cartelle ci sono tre cartelle: Raw , Edited e Final . Il mio obiettivo è, con un singolo script bash, creare collegamenti simbolici sul mio desktop per ogni cartella Final E rinominarlo nella sua cartella padre. Esempio: vorrei /Volumes/Server\ RAID/Photos/2016-10\ Fleet\ Week/Final per avere un collegamento simbolico sul desktop chiamato 2016-10 Fleet Week .

Ho provato molte diverse varietà di codice che ho postato in basso, ma il codice che ho incluso era il codice più conciso (anche se non funzionava).

Descrizione del codice:

  1. cd sul desktop in modo che i link simbolici vengano creati lì
  2. usa il ciclo per scorrere ciclicamente le cartelle
  3. crea un link simbolico - ecco il problema: devo aggiungere il nome della cartella nel percorso del file in qualche modo, ma aggiungere anche \ prima degli spazi in modo che il comando non abbia esito negativo. TUTTAVIA, ho ricevuto messaggi di errore che dicevano che non c'è posto chiamato RAID/Photos che mi fa pensare che lo script inciampi sul primo spazio, anche con la barra rovesciata.
  4. Cambia il nome di Final link simbolico al nome della cartella. (Supponevo che non avessi bisogno di directory complete qui perché sono già in Desktop

    cd Desktop
    for f in /Volumes/Server\ RAID/Photos;
    do ln -s /Volumes/Server\ RAID/Photos/"$f"/Final
    mv Final $f
    done
    

DOMANDA: Qualcuno può aiutarmi a scovare questo script? (Mi interesso principalmente della terza parte, ma non direi di no per aiutare il resto).

    
posta NoahL 17.04.2017 - 20:03
fonte

1 risposta

3

Quando si verificano problemi con la quotatura della shell, è sempre utile aggiungere le dichiarazioni di echo in posizioni appropriate nello script per vedere cosa sta succedendo.

Diamo un'occhiata a questa riga per riga:

for f in /Volumes/Server\ RAID/Photos;

Viene eseguito solo una volta e imposta f su Volumes/Server RAID/Photos , che probabilmente non è quello che desideri.

do ln -s /Volumes/Server\ RAID/Photos/"$f"/Final

f è impostato sul percorso completo (vedi sopra), quindi questo si espande in

ln -s /Volumes/Server\ RAID/Photos//Volumes/Server\ RAID/Photos/Final

che (di nuovo) non è quello che vuoi vedere qui.

mv Final $f

Vedi sopra: -)

Ci sono vari modi per affrontare questo problema, ma nel tuo caso vorrei fare qualcosa di simile al seguente (per evitare la sfida di dover estrarre il nome della directory dal percorso sorgente)

cd /Volumes/Server\ RAID/Photos/
for f in *; do
    if [ -d "$f" ]; then 
        if [ -d "$f"/Final ]; then
            ln -s "/Volumes/Server RAID/Photos/$f/Final" ~/Desktop/"$f"
        fi
    fi
done

I due if s coprono i casi in cui ci sono file nella directory sorgente o manca la directory Final .

    
risposta data 17.04.2017 - 20:23
fonte

Leggi altre domande sui tag