我在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
。如果您想尝试提取,则可以将其删除。