tar
ファイルの名前を指定するために情報をパイプするにはどうすればよいですか?
6 に答える
何かのようなもの:
tar cfz foo.tgz --files-from=-
ただし、これは考えられるすべてのファイル名で機能するわけではないことに注意してください。からの--null
オプションとフィードを検討する必要があります。(この例は、複数のコマンドを生成するため、大きなファイル リストではうまく機能しません。)tar
find -print0
xargs
tar
geekosaur によって既に指摘されているように、の出力をusingに直接パイプできるため、の出力find
をパイプする必要はありません。xargs
find
tar
find ... -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 -
ギーコサウルスの答えを拡張する:
find /directory | tar -cf archive.tar -T -
オプションで stdin を使用でき-T
ます。
一般に、何らかの条件 (オプションなど) を使用してファイルをフィルタリングする場合は、パイプ内のディレクトリを除外する-name
必要があることに注意してください。そうしないと、tar がすべてのコンテンツを処理してしまうため、これは望ましくありません。したがって、次を使用します。
find /directory ! -type d -name "mypattern" | tar -cf archive.tar -T -
を使用しない場合は-type
、一致"mypattern"
するディレクトリのすべてのコンテンツが追加されます。
find /directory > filename
tar -T filename -cf archive.tar
パイプを使用する代わりに、バックティックを使用できます。
tar cvzf archive.tgz `ls -1 *`
代わりに、ls -1 *
アーカイブに必要なファイルのリストを生成する他のコマンドを配置できます