答え1
Pass zsh
、@
glob修飾子を使用して、glob拡張を次の種類のファイルに制限できます。シンボリックリンク:
tar -czf file.tar.gz -- *(@)
隠しファイルを含めるにはD
(D
他のファイルの場合)修飾子を追加します。
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