Snažím se automatizovat nasazení webové aplikace ve vývoji, která je často aktualizována. Webová aplikace je dodávána ve formě souboru zip s neznámým názvem a touto adresářovou strukturou:
unknown_name.zip
└── unknown_folder_name
└──all_the_application_files
Potřebuji bash skript k:
- odstraňte veškerý obsah /var/www/ [hotovo]
- rozbalte archiv neznámého_jméno.zip v dané cestě tmp [hotovo]
- cd uvnitř této známé cesty tmp [hotovo]
- cd uvnitř neznámého_název_složky extrahované z neznámého_název.zip
- přesunout all_the_application_files do /var/www [snadno, pokud vyřešíme předchozí odrážku]
Důležité:uvnitř adresáře tmp bude pouze jeden adresář, ten, do kterého chci jít. Můj aktuální bash skript:
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/
Přijatá odpověď:
Řešení
Pokud s jistotou víte, že v aktuálním adresáři je přesně jeden adresář a nic jiného (žádná další složka a žádný jiný soubor), můžete do tohoto adresáře vstoupit pomocí
cd *
Pokud víte, že existuje pouze jeden adresář, ale v aktuálním adresáři mohou být soubory bez adresáře a bez symbolických odkazů na adresář, můžete použít
cd */.
pro výběr pouze adresáře.
Vysvětlení
Jeden *
je shellem rozšířen na seznam všech názvů souborů (včetně podadresářů) v aktuálním adresáři (kromě skrytých souborů, zejména adresářů .
a ..
které jsou tam vždy). Pokud je jedinou věcí v aktuálním adresáři podadresář, který je třeba zadat, rozbalí se na
cd unknown_folder_name
a tak si dělejte, co chcete.
Trik s */.
spočívá v tom, že se to rozšíří na „samo adresář“ (pojmenovaný .
) v libovolném podadresáři, což je samozřejmě podadresář samotný. Protože názvy souborů nikdy nemohou obsahovat /
a za předpokladu, že existuje pouze jeden adresář, jediný název, na který se rozbalí, bude unknown_folder_name/.
, což je samozřejmě stejný adresář jako unknown_folder_name
.