技术细节:Ubuntu 20.04 左右,编写 bash 脚本。
我正在编写一个脚本,用于接收大量 tar.gz 文件,解压它们,并将其组件复制到临时目录中,每个 tar.gz 文件一个。我们将各个目录称为 tempN,其中 N 是目录编号。到目前为止,它运行良好,没有问题。
现在,在这些 tar 文件中,以下两件事之一将成立:
- 创建它们的用户将他们的资料打包到另一级目录中,因此现在有一个目录 tempN/someUserDirectory。我不知道 someUserDirectory 的名称,因为这取决于用户想如何命名。但我确信该用户目录中没有子目录,因此我需要从用户那里获取的文件完全位于该目录中(如果用户选择创建子目录,则不在 tempN 中)
- 用户没有创建子目录,因此他们的文件位于 tempN 目录本身中
在案例 1 中,我需要将文件从 tempN/someUserDirectory 传输到 tempN 本身,以便处理用户文件。但由于我不知道 someUserDirectory 的名称,我该怎么做?有没有相反的 .. 可以让我更深入一层?
答案1
提取后,计算输出目录中的项目数:
declare -a items=("$outdir"/*)
(你大概可以假设你的用户不会给你.dotfiles
,我猜?)
如果只有一个项目,并且它是一个目录,
if (( ${items[@]} == 1 )) && [[ -d "${items[0]}" ]]
然后只需将其名称添加到输出路径,然后继续处理 $outdir 即可:
outdir=${items[0]}
另一种方法是列出档案中的所有文件,并检查它们是否都具有相同的第一个路径组件,如果是,则使用 tar 的选项在提取时删除组件。但是,列出 .tar 档案中的文件可能与提取它一样慢,因此此方法更适合 .zip/.rar 档案(具有中央文件索引)。