我正在尝试自动部署正在开发且经常更新的网络应用程序。 Web 应用程序以 zip 文件的形式出现,名称未知,目录结构如下:
unknown_name.zip
└── unknown_folder_name
└──all_the_application_files
我需要一个 bash 脚本来:
- 删除 /var/www/ 的所有内容 [完成]
- 在给定的临时路径中解压缩unknown_name.zip存档[完成]
- cd 到已知的 tmp 路径中 [完成]
- cd 从unknown_name.zip 中提取的unknown_folder_name 内
- 将 all_the_application_files 移动到 /var/www [如果我们解决了前面的问题就很容易]
重要提示:tmp 目录中只有一个目录,即我想要进入的目录。我当前的 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/
答案1
解决方案
如果您确定当前目录中只有一个目录并且没有其他目录(没有其他文件夹和文件),则可以使用以下命令进入该目录
cd *
如果您知道只有一个目录,但当前目录中可能存在非目录和非符号链接到目录的文件,您可以使用
cd */.
仅选择目录。
解释
单个文件*
被 shell 扩展为当前目录中所有文件名(包括子目录)的列表(不包括隐藏文件,尤其是始终存在的目录.
和)。..
如果当前目录中唯一的内容是要输入的子目录,则该子目录将扩展为
cd unknown_folder_name
然后做你想做的事。
技巧在于*/.
,这会扩展到任何子目录中的“自身目录”(名为.
),这当然是子目录本身。由于文件名永远不能包含/
,并且假设只有一个目录,因此它扩展为的唯一名称将是unknown_folder_name/.
,这当然与 是同一目录unknown_folder_name
。