Sto cercando di automatizzare la distribuzione di una webapp in fase di sviluppo che viene aggiornata frequentemente. La webapp si presenta sotto forma di un file zip con nome sconosciuto e questa struttura di directory:
unknown_name.zip
└── unknown_folder_name
└──all_the_application_files
Ho bisogno di uno script bash per:
- rimuove tutto il contenuto di /var/www/ [fatto]
- decomprimere l'archivio unknown_name.zip, in un determinato percorso tmp [fatto]
- cd all'interno di quel percorso tmp noto [fatto]
- cd all'interno del nome_cartella_sconosciuto estratto da nome_sconosciuto.zip
- sposta tutti i_file_dell'applicazione in /var/www [facile se risolviamo il punto precedente]
Importante:all'interno della directory tmp ci sarà solo una directory, quella in cui voglio andare. Il mio attuale script bash:
rm -r /var/www/*
unzip ./*.zip * -d /home/lese/tmp-deploy
cd /home/lese/tmp-deploy
# HERE I WOULD cd unknown_folder_name
mv * /var/www/
Risposta accettata:
Soluzione
Se sai per certo che c'è esattamente una directory e nient'altro (nessun'altra cartella e nessun altro file) nella directory corrente, puoi entrare in quella directory con
cd *
Se sai che c'è solo una directory, ma potrebbero esserci file non directory e non link simbolici alla directory nella directory corrente, puoi usare
cd */.
per selezionare solo la directory.
Spiegazione
Un unico *
viene espanso dalla shell in un elenco di tutti i nomi di file (che include le sottodirectory) nella directory corrente (esclusi i file nascosti, in particolare le directory .
e ..
che ci sono sempre). Se l'unica cosa nella directory corrente è la sottodirectory da inserire, questa si espanderà in
cd unknown_folder_name
e quindi fai quello che vuoi.
Il trucco con */.
è che questo si espande nella "directory self" (denominata .
) in qualsiasi sottodirectory, che è ovviamente la sottodirectory stessa. Poiché i nomi dei file non possono mai contenere un /
, e presupponendo che ci sia solo una directory, l'unico nome a cui si espande sarà unknown_folder_name/.
, che è ovviamente la stessa directory di unknown_folder_name
.