74

tarファイルの名前を指定するために情報をパイプするにはどうすればよいですか?

4

6 に答える 6

111

何かのようなもの:

tar cfz foo.tgz --files-from=-

ただし、これは考えられるすべてのファイル名で機能するわけではないことに注意してください。からの--nullオプションとフィードを検討する必要があります。(この例は、複数のコマンドを生成するため、大きなファイル リストではうまく機能しません。)tarfind -print0xargstar

于 2011-03-04T22:54:28.730 に答える
23

geekosaur によって既に指摘されているように、の出力をusingに直接パイプできるため、の出力findをパイプする必要はありません。xargsfindtarfind ... -print0 | tar --null ...

ただし、アーカイブ ファイルを除外する場合のgnutarとのわずかな違いに注意してください。bsdtar

# exclude file.tar.gz anywhere in the directory tree to be tar'ed and compressed
find . -print0 | gnutar --null --exclude="file.tar.gz" --no-recursion -czf file.tar.gz --files-from -
find . -print0 | bsdtar --null --exclude="file.tar.gz" -n -czf file.tar.gz -T -

# bsdtar excludes ./file.tar.gz in current directory by default
# further file.tar.gz files in subdirectories will get included though
# bsdtar: ./file.tar.gz: Can't add archive to itself
find . -print0 | bsdtar --null -n -czf file.tar.gz -T -

# gnutar does not exclude ./file.tar.gz in current directory by default
find . -print0 | gnutar --null --no-recursion -czf file.tar.gz --files-from -
于 2012-03-02T13:40:21.727 に答える
18

ギーコサウルスの答えを拡張する:

find /directory | tar -cf archive.tar -T -

オプションで stdin を使用でき-Tます。

一般に、何らかの条件 (オプションなど) を使用してファイルをフィルタリングする場合は、パイプ内のディレクトリを除外する-name必要があることに注意してください。そうしないと、tar がすべてのコンテンツを処理してしまうため、これは望ましくありません。したがって、次を使用します。

find /directory ! -type d -name "mypattern" | tar -cf archive.tar -T -

を使用しない場合は-type、一致"mypattern"するディレクトリのすべてのコンテンツが追加されます。

于 2012-12-28T17:47:50.340 に答える
3
find /directory > filename
tar -T filename -cf archive.tar
于 2011-11-23T03:10:51.167 に答える
3

パイプを使用する代わりに、バックティックを使用できます。

tar cvzf archive.tgz `ls -1 *`

代わりに、ls -1 *アーカイブに必要なファイルのリストを生成する他のコマンドを配置できます

于 2010-04-08T06:36:53.633 に答える