0

30日以上経過したすべてのファイルを1つのアーカイブファイルにバックアップしたいと思います。

私はこのスクリプトを使ってみます:

#!/bin/bash

# Find all files that older than 30 days and store it into backup.tar.gz
find ~/Algorithm/test/PDF -mtime +30 -exec tar czvf backup.tar.gz {} \;

しかし残念ながら、すべてのファイルではなく最後のファイルだけをバックアップします。上記のスクリプトは、最初にbackup.tar.gzを最後のファイルに置き換えるだけであることがわかりました。

スクリプトに何か足りないものがある場合は、アドバイスしてください。

4

3 に答える 3

5

を使用し\;てfind-execを終了すると、ファイルごとに1回コマンドが実行されます。そのため、tarを何度も実行し、そのたびに1つのファイルを含むtarファイルを作成し、それぞれが前のファイルを上書きしました。

\;をaに変更すると、+複数のファイルがexecコマンドの1回の実行にグループ化されるため、少しうまく機能しますが、問題が潜んでいます。コマンドラインに収まらないファイルが多すぎる場合、findはそれを分割し、前の問題を繰り返すことになります。

これを実際にきれいに行うには、コマンドラインにすべてを収めようとするのではなく、読み取ることができるfindファイルのリストを生成する必要があります。tarまた、すべてのファイル名を正しく処理するには、リストを「\0」で区切った形式にする必要があります。GNU tar&findはそれを行うことができます:

find ~/Algorithm/test/PDF -mtime +30 -print0 |
  tar --null --files-from=- -czvf backup.tar.gz
于 2012-07-30T03:38:46.447 に答える
0

既存の解凍されたファイルがすでにありbackup.tar、tarballにファイルを追加することもできます。

 find . -exec tar rf backup.tar && gzip backup.tar

これが他の方法に対してどのようにベンチマークされるかはわかりませんが、意図したとおりに機能するはずです。

于 2012-07-30T06:33:42.690 に答える
0

find見つかったファイルごとに関数を実行します。これを機能させるには、リストを関数に渡す必要があります。検索をサブ関数として実行し、tar gzipチェーンに渡すと機能するはずです。

 tar czvf - $(find ~/Algorithm/test/PDF -mtime +30) | gzip -c backup.tar.gz
于 2012-07-30T03:34:01.627 に答える