Saya mencoba mengotomatiskan penyebaran aplikasi web yang sedang dikembangkan yang sering diperbarui. Aplikasi web hadir dalam bentuk file zip dengan nama yang tidak diketahui, dan struktur direktori ini:
unknown_name.zip
└── unknown_folder_name
└──all_the_application_files
Saya memerlukan skrip bash untuk:
- hapus semua isi /var/www/ [selesai]
- buka kompresi arsip unknown_name.zip, di jalur tmp tertentu [selesai]
- cd di dalam jalur tmp yang diketahui [selesai]
- cd di dalam unknown_folder_name diekstrak dari unknown_name.zip
- pindahkan all_the_application_files ke /var/www [mudah jika kita selesaikan butir sebelumnya]
Penting:di dalam direktori tmp hanya akan ada satu direktori, yang ingin saya masuki. Skrip bash saya saat ini:
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/
Jawaban yang Diterima:
Solusi
Jika Anda tahu pasti hanya ada satu direktori dan tidak ada yang lain (tidak ada folder lain dan tidak ada file lain) di direktori saat ini, Anda dapat masuk ke direktori tersebut dengan
cd *
Jika Anda tahu bahwa hanya ada satu direktori, tetapi mungkin ada file non-direktori dan non-symlink-to-directory di direktori saat ini, Anda dapat menggunakan
cd */.
untuk memilih direktori saja.
Penjelasan
Satu *
diperluas oleh shell ke daftar semua nama file (termasuk subdirektori) di direktori saat ini (tidak termasuk file tersembunyi, terutama direktori .
dan ..
yang selalu ada). Jika satu-satunya hal di direktori saat ini adalah subdirektori untuk dimasuki, ini akan diperluas ke
cd unknown_folder_name
dan dengan demikian lakukan apa yang Anda inginkan.
Triknya dengan */.
adalah bahwa ini diperluas ke "direktori mandiri" (bernama .
) di setiap subdirektori, yang tentu saja merupakan subdirektori itu sendiri. Karena nama file tidak pernah boleh berisi /
, dan dengan asumsi hanya ada satu direktori, satu-satunya nama yang akan diperluas adalah unknown_folder_name/.
, yang tentu saja merupakan direktori yang sama dengan unknown_folder_name
.