Estoy tratando de automatizar la implementación de una aplicación web en desarrollo que se actualiza con frecuencia. La aplicación web viene en forma de archivo zip con nombre desconocido y esta estructura de directorio:
unknown_name.zip
└── unknown_folder_name
└──all_the_application_files
Necesito un script bash para:
- eliminar todo el contenido de /var/www/ [hecho]
- descomprima el archivo unknown_name.zip, en una ruta tmp determinada [hecho]
- cd dentro de esa ruta tmp conocida [hecho]
- cd dentro de unknown_folder_name extraído de unknown_name.zip
- mover todos_los_archivos_de_la_aplicación a /var/www [fácil si resolvemos la viñeta anterior]
Importante:dentro del directorio tmp solo habrá un directorio, al que quiero ir. Mi script bash actual:
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/
Respuesta aceptada:
Solución
Si está seguro de que hay exactamente un directorio y nada más (ninguna otra carpeta ni ningún otro archivo) en el directorio actual, puede ingresar a ese directorio con
cd *
Si sabe que solo hay un directorio, pero puede haber archivos que no sean de directorio ni enlaces simbólicos a directorio en el directorio actual, puede usar
cd */.
para seleccionar solo el directorio.
Explicación
Un solo *
es expandido por el shell a una lista de todos los nombres de archivo (que incluye subdirectorios) en el directorio actual (excluyendo archivos ocultos, especialmente los directorios .
y ..
que siempre están ahí). Si lo único en el directorio actual es el subdirectorio para ingresar, esto se expandirá a
cd unknown_folder_name
y así hacer lo que quieras.
El truco con */.
es que esto se expande al "directorio propio" (llamado .
) en cualquier subdirectorio, que por supuesto es el propio subdirectorio. Dado que los nombres de archivo nunca pueden contener un /
, y suponiendo que solo hay un directorio, el único nombre al que se expandirá será unknown_folder_name/.
, que por supuesto es el mismo directorio que unknown_folder_name
.