如何在解压缩许多zip之前删除文件夹的内容?(bash脚本)



我在FTP上有很多文件夹及其内容,其中一些文件夹我必须不时更新。我通过解压缩收到的zip文件来更新它们。zip的名称可能多种多样,但在zip中,总有一个主文件夹的名称与应该在FTP上更新的文件夹的名称完全相同。除了包含其内容的主文件夹之外,zip中没有其他文件/文件夹。所以我在下面写了一个简单的脚本来更新它们:

unzip -o *.zip
rm -f *.zip

问题是,有时这些文件夹中有一些文件应该删除——它们不再存在于有更新的zip中。我意识到,当我解压缩和覆盖时,没有任何东西被删除。有可能修改这个脚本,在解压缩之前删除整个文件夹吗?要更新的文件夹的正确名称不是zip的名称,而是zip中主文件夹的名称,因此我不知道如何解决这个问题。我找不到现有的解决方案。此外,有时我一次上传很多zip,FTP上有数千个文件夹,所以很难为每个文件夹编写一个命令。

您可以使用unzip配套程序zipinfo来列出zip文件的内容。添加模式*/以仅列出目录。然后通过管道连接到xargs以移除它们。

zipinfo -1 '*.zip' '*/' | xargs rm -rf 2>/dev/null

这将一次删除所有现有目录(在现有zip文件中匹配(。然后,您可以运行脚本的其余部分来提取新的脚本。

您可以在xargs之前添加cut -d / -f 1 | sort -u |,以筛选出rm的任何子目录,但即使有也不重要。

xargs按空格分隔行,因此包含空格的目录名可能会导致删除不同的目录。对于GNUxargs,您可以添加--delimiter='n'来阻止它(也有--null,但zip无论如何都会截断文件名中的新行(。您也可以通过管道连接grep -v '[[:space:]]'来排除包含空格的目录。

另一种可能有用的方法是一次处理一个zip文件:

for zip in *.zip; do
dirs=$(zipinfo -1 "$zip" '*/') || continue
IFS=$'n' read -rd '' -a dirs<<<"$dirs"
rm -rf "${dirs[@]}"
unzip -o "$zip"
done

这种方法也适用于空白。将dirs拆分为一个阵列意味着,如果存档中有多个目录,则rm仍将成功。如果zipinfo失败,则可能意味着存档已损坏或无法读取,因此|| continue。如果您想尝试提取,则可以将其删除。

最新更新