J'essaie d'automatiser le déploiement d'une application Web en cours de développement qui est fréquemment mise à jour. L'application Web se présente sous la forme d'un fichier zip avec un nom inconnu, et cette structure de répertoire :
unknown_name.zip
└── unknown_folder_name
└──all_the_application_files
J'ai besoin d'un script bash pour :
- supprimer tout le contenu de /var/www/ [done]
- décompresser l'archive unknown_name.zip, dans un chemin tmp donné [done]
- cd à l'intérieur de ce chemin tmp connu [done]
- cd à l'intérieur du unknown_folder_name extrait du unknown_name.zip
- déplacez tous_les_fichiers_d'application vers /var/www [facile si nous résolvons le point précédent]
Important :à l'intérieur du répertoire tmp, il n'y aura qu'un seul répertoire, celui dans lequel je veux aller. Mon script bash actuel :
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/
Réponse acceptée :
Solution
Si vous savez avec certitude qu'il y a exactement un répertoire et rien d'autre (aucun autre dossier et aucun autre fichier) dans le répertoire actuel, vous pouvez entrer dans ce répertoire avec
cd *
Si vous savez qu'il n'y a qu'un seul répertoire, mais qu'il peut y avoir des fichiers sans répertoire et sans lien symbolique vers le répertoire dans le répertoire actuel, vous pouvez utiliser
cd */.
pour sélectionner uniquement le répertoire.
Explication
Un seul *
est étendu par le shell à une liste de tous les noms de fichiers (qui inclut les sous-répertoires) dans le répertoire courant (à l'exclusion des fichiers cachés, en particulier les répertoires .
et ..
qui sont toujours là). Si la seule chose dans le répertoire courant est le sous-répertoire à entrer, cela s'étendra à
cd unknown_folder_name
et fais donc ce que tu veux.
L'astuce avec */.
est que cela s'étend au "répertoire personnel" (nommé .
) dans n'importe quel sous-répertoire, qui est bien sûr le sous-répertoire lui-même. Étant donné que les noms de fichiers ne peuvent jamais contenir un /
, et en supposant qu'il n'y a qu'un seul répertoire, le seul nom auquel il se développe sera unknown_folder_name/.
, qui est bien sûr le même répertoire que unknown_folder_name
.