tar: 圧縮後にファイルを削除するがディレクトリは保持する方法

tar: 圧縮後にファイルを削除するがディレクトリは保持する方法

tarで完全なディレクトリをパックしたい

tar cvjf dir.tbz dir

ただし、すべてのファイルを削除する

tar cvjf dir.tbz dir --remove-files

しかし、これにより./dirも削除されます。そこで、パックする前にディレクトリにcdしようとしました。

tar cvjf dir.tbz --remove-files -C dir .

しかし、それでも ./dir は削除されます... 私には意味がわかりません。なぜ tar が作業ディレクトリ自体を削除する必要があるのでしょうか? ディレクトリ全体をパックして、ディレクトリ全体を削除せずにパック後にファイルを削除することはできないのでしょうか?

./dir に継続的にファイルを作成するプロセスを実行しており、1 時間ごとにすべてのファイルをパックし、パックされたファイルを削除したいと考えています。tar の後に mkdir を実行して削除することもできますが、mkdir がディレクトリを再作成する前に新しいファイルを書き込もうとすると、ファイルを作成する他のプロセスが問題を引き起こす可能性があります。

答え1

次のようなことを試してください:

find dir -type f -mmin +1 | xargs -I{} sh -c 'tar rvf dir.tar {} && rm {}'
bzip2 dir.tar && mv dir.tar.bz2 dir-$(date +%F-%T).tbz

これは現在のコマンドよりも少し複雑ですが、機能し、競合の問題はないと思います (ファイルが 1 分を超える間隔で複数回書き込まれない限り)。

このfindコマンドは、dir少なくとも 1 分以上前の (つまり現在書き込みが行われていない) 内のすべてのファイルを検索します。次に、このリストは にパイプされxargs、各ファイルが順にdir.tarファイルに追加されます。ファイルが tar ファイルに正常に追加されたら、元のファイルは削除されます。一度に 1 つずつ実行することで、多数のファイルがある場合にコマンド ラインが長くなりすぎる問題を回避できます。最後に、tar ファイルを圧縮して名前を変更できます。

答え2

これに対する私の回避策は次のようになります:

ディレクトリに cd し、./* を使用して内容を tar してから削除するスクリプトを作成します。-C でも同じことが実行され、1 つのコマンド ラインで実行できると期待していましたが、そうではありませんでした。

#!/bin/bash

cd /path/to/dir
tar cvjf dir.tbz ./* --remove-files

動作するはずです。

関連情報