ディレクトリ内のシンボリックリンクのみをtar.gzに圧縮する方法は?

ディレクトリ内のシンボリックリンクのみをtar.gzに圧縮する方法は?

このスクリーンショットのように、特定のディレクトリからのシンボリックリンクのみを圧縮するには、Linuxコマンドが必要です。名前を圧縮する必要はありません。このように

tar -czf /tmp/test.tar.gz cars movies plugin 2.txt 10.txt

シンボリックリンク名は変更可能で固定されていないため ここに画像の説明を入力してください。

答え1

Pass zsh@glob修飾子を使用して、glob拡張を次の種類のファイルに制限できます。シンボリックリンク:

tar -czf file.tar.gz -- *(@)

隠しファイルを含めるにはDD他のファイルの場合)修飾子を追加します。

tar -czf file.tar.gz -- *(D@)

find他のシェルでは、次の種類のファイルを見つけるために使用できます。シンボリックリンク次のアドレスに転送してくださいtar

find . ! -name . -prune -type l -exec tar -zcf file.tar.gz {} +

しかし、zshアプローチと比較していくつかの違いに注意してください。

  • 隠しファイルが含まれており、次のものが必要です。

    LC_ALL=C find . ! -name . -prune ! -name '.*' -type l -exec tar -zcf file.tar.gz {} +
    

    確実に取り除いてください。

  • ファイルリストがソートされていません。

  • プレフィックスは./アーカイブメンバーに追加されます(これが私たちが必要ない理由です--)。

  • 一致するファイルが多い場合は、複数回find呼び出すことができますtar。つまり、file.tar.gz最後の実行のファイルのみが含まれます。 (この場合、zshアプローチを使用すると、次のような結果が得られます。パラメータリストが長すぎます。代わりにエラー)。

find、およびmoreutilssortのGNU実装を使用すると、tar次のようにしてこれらの問題を解決できます。ifne

LC_ALL=C find . ! -name . -prune ! -name '.*' -type l -printf '%P\0' |
  sort -z |
  ifne tar -zcf file.tar.gz --null -T -

どこ:

  • -printf '%P\0'起動ディレクトリ()に基づいてファイルパスを印刷するために使用します。.たとえば、ゼロはlinkファイルパス./linkには現れない唯一のバイト値であるため、NULで区切られます。
  • sort -zこれらのNULで区切られたレコードは、zsh globと同様に、ロケールの照合に従って語彙的にソートされます。
  • tar引数のサイズに対するシステムの制限を避けるために、リストを引数として渡すのではなく、標準入力のパイプを介してリストを渡します。
  • ifneファイルが存在しない場合を処理する必要があります。この場合、GNU 1.34は、ファイルがなければ、少なくともtarゼロで埋められたほぼ希薄な10KiBを生成するようです。file.tar.gz

/tmpそれにもかかわらず、固定名のファイルはセキュリティ上のリスクがあるため、グローバルに書き込み可能なディレクトリに作成してはいけません。

答え2

コマンドラインでは、人々は複数のコマンドを組み合わせて複雑なタスクを解決します。シンボリックリンク名にスペースや特殊文字がないことがわかっている場合は、単に次のようにfind使用できます。コマンドの置き換え:

tar -czf /tmp/test.tar.gz `find -maxdepth 1 -type l`

たとえば、名前のスペースやセミコロンには適用されません。この場合の簡単な解決策は、リストを一時ファイルに書き込むことです。

TMPLIST=`mktemp`
find -maxdepth 1 -type l -print0 > $TMPLIST
tar -czf /tmp/test.tar.gz --null --files-from $TMPLIST
rm $TMPLIST

関連情報