![我有一个 zip 文件。我将其解压并修改了一些文件。如何列出它们?](https://linux22.com/image/1168950/%E6%88%91%E6%9C%89%E4%B8%80%E4%B8%AA%20zip%20%E6%96%87%E4%BB%B6%E3%80%82%E6%88%91%E5%B0%86%E5%85%B6%E8%A7%A3%E5%8E%8B%E5%B9%B6%E4%BF%AE%E6%94%B9%E4%BA%86%E4%B8%80%E4%BA%9B%E6%96%87%E4%BB%B6%E3%80%82%E5%A6%82%E4%BD%95%E5%88%97%E5%87%BA%E5%AE%83%E4%BB%AC%EF%BC%9F.png)
基本上,我想做一个比较,并在文件夹中递归列出二进制更改的文件。我想避免使文件系统混乱,所以我认为这涉及一些管道。
我搜索了一些例子但每个人都在寻找 zip-to-zip 差异。
实际用例是更新 Web 应用程序:我想使用当前版本setup-v1.23.zip
文件列出要备份的自定义文件,然后用setup-v1.75.zip
原始供应商的较新文件的内容覆盖文件夹。
我将使用 PHPshell_exec()
执行脚本文件并读取结果列表以进行进一步处理。
答案1
您可以比较crc32
校验和:
#!/bin/bash
target_dir="/path/to/target/"
archive="/path/to/archive.zip"
# Loop through files in archive
while IFS= read -r filename; do
# Check if file exists in target:
[ -f "${target_dir}/${filename}" ] || { echo "new: '$filename'"; continue; }
# Get CRC32 Checksum from target
crc_in_target=$(crc32 "${target_dir}/${filename}")
# Get CRC32 Checksum from zip
crc_in_zip=$(unzip -vqq a.zip "$filename" | awk '{print $7}')
# Compare Checksums
[ "$crc_in_target" = "$crc_in_zip" ] || echo "changed: '$filename'"
done < <(unzip -Z -1 "$archive")
注意:当文件名包含换行符时,可能会出现问题。
好吧,我很确定您可以php
直接使用 执行相同操作,而无需调用 shell。您可以php
在 stackoverflow.com 上寻求帮助。