我有一个包含文件、子目录和符号链接的目录
如何拉拉链仅有的该目录中没有符号链接的文件和文件夹或符号链接引用的文件?
答案1
使用“zip -y”选项它会按原样复制链接,而不是完整的文件。
答案2
您可以使用@exclude_file
:将符号链接及其目标路径1保存在文本文件中,然后压缩目录并使用该文件排除这些路径,例如
find /full/path/to/dir -type l -print -exec readlink -f {} \; > exclude.lst
zip -r myarchive /full/path/to/dir [email protected]
1:假设文件名正常
答案3
尽管 Zip 3.0(2008 年 7 月 5 日)声称支持-y
存储符号链接,但似乎在 Ubuntu 20.04 上使用此选项排除了它们,以获取未包含在存档中的文件引用。看来你的选择是:
不要使用
-y
并包含实际文件将 tar 与 一起使用
gzip
,例如tar -czvf archive.tar.gz files_to_include
答案4
您可以使用更多命令来使用更合适的过滤器,还可以使用 bash 数组来避免创建列表文件。
以下脚本一次性完成所有操作。它不包括:
- 指向文件的符号链接
- 指向包含文件的文件夹的符号链接
- 仅包含符号链接的真实文件夹
while read -r symlink ; do
excluded+=("${symlink}")
target="$(readlink "${symlink}")"
if [[ -d "${target}" ]] ; then
excluded+=("${symlink}*")
fi
done <<< "$(find . -type l)"
while read -r dir ; do
file_count="$(find "$dir" -type f | wc -l)"
if [[ "${file_count}" -eq 0 ]] ; then
excluded+=("${dir}*")
fi
done <<< "$(find . -type d)"
zip -r "./archive.zip" "/directory/to/archive/" -x "${excluded[@]}"
2 个 while 循环将路径附加到馈送到 zip 的“排除”数组:
- 第一个附加所有符号链接(指向文件或文件夹)
- 第二个附加不包含文件的真实文件夹(符号链接不算作文件)
笔记:就我而言,我的文件名包含[括号]。 zip 命令解释它们,所以我必须用反斜杠转义左括号。为此,我不是将${symlink}
or附加${dir}
到数组,而是附加${symlink//\[/\\\[}
or ${dir//\[/\\\[}
。