シンボリックリンクとシンボリックリンクが指すファイルを除いて、ディレクトリをどのように圧縮できますか?

シンボリックリンクとシンボリックリンクが指すファイルを除いて、ディレクトリをどのように圧縮できますか?

ファイル、サブディレクトリ、およびシンボリックリンクを含むディレクトリがあります。

ジッパーでロックする方法ただそのディレクトリにシンボリックリンクされたファイルとフォルダがないか、シンボリックリンクで参照されているファイルがありませんか?

答え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日)はシンボリックリンクの保存をサポートしていると主張していますが、-yUbuntu 20.04でこのオプションを使用すると、アーカイブに含まれていないファイル参照に対してシンボリックリンクが除外されるようです。あなたのオプションは次のとおりです。

  • -y実際のファイルを使用したり含めたりしないでください。

  • gzipたとえば、tarを使用してください。

    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に提供されている「除外」配列にパスを追加します。

  • 最初は、すべてのシンボリックリンク(ファイルまたはフォルダを指す)を追加します。
  • 2番目はファイルなしで実際のフォルダを追加します(シンボリックリンクはファイルとは見なされません)。

メモ:私の場合、ファイル名に[括弧]が含まれています。 zipコマンドはそれを解釈するので、バックスラッシュを使用して左角括弧をエスケープする必要があります。これを行うには、配列に${symlink}orを追加する代わりにorを追加します。${dir}${symlink//\[/\\\[}${dir//\[/\\\[}

関連情報