私のシステム(Ubuntu)にwget
。 。すべてのファイルは私のオフィスで特定の時点で作成され、すべて同じ時間と日付を持っています。 Rsyncやその他のオフィス接続は許可されていません。
1日に4回同期するのにファイルがどれだけ頻繁に生成されるかについてのパターンはありません。フォルダは数週間変更されず、1日10回変更されることがあります。新しいファイルが作成されると、名前はA156.1. [a,b,x,y,z]に似ています。各ファイルはかなり大きいです(〜500 MB)。
したがって、私のシステムには、ファイルセット(5)が1つ以上(合計10個のファイルx 500 MB = 5 GB)がなくなります。
フォルダを頻繁にチェックし、古いファイルを削除するためにcronで実行できる簡単なスクリプトはありますか?それで最後の5セットだけ終わります。日より古いファイルの削除などの操作を実行できますが、次のファイルセットがいつ作成されるのかわかりません。
答え1
find
パイプsort
で接続できます。日付でソートされたファイルのリストを使用してから出力cut
からを使用してファイルのリストを生成し、を使用してrm
最新の5つのファイルを除くすべてのファイルを削除します。これを定期的に実行すると、目的の結果が得られます。
既存のスクリプトについてはよくわかりませんが、実装は非常に簡単です。
答え2
zshが使えるならグローバル予選これにより、次の作業が簡単になります。
zsh -c 'rm work-folder/*(om[6,-1])'
これは、作業フォルダディレクトリ内のすべてのファイルをo
変更時間ごとにソートして選択することを意味しますm
。追加の選択範囲は6から最後までです。これにより、フォルダに最新の5つのファイルが残ります。
ディレクトリに6つ以上のファイルがあると仮定すると、削除に対してより安全であることをテストできます(すべてzshで)。
files=(work/*(om))
[ ${#files[@]} -gt 5 ] && echo rm "${files[6,-1]}"
bashは各ファイルを呼び出しstat
て直接追跡する必要があるため、より多くの作業が必要です。この行。
答え3
次のスクリプトは、ディレクトリの「新しいファイル」と「古いファイル」のリストを表示します。 「新しいファイル」は最後のスクリプトの実行以降に変更されたファイルであり、「古いファイル」は最後のスクリプトの実行以降に変更されなかったファイルです。
スクリプトは出力をdate
「タイムスタンプファイル」に書き込み、次回の実行時にそのファイルを使用してどのファイルが変更されたかを確認します。初めて実行すると、出力は生成されません。
このスクリプトは手動で実行する必要があり、作成時に機会のみが提供されます。発覚特定のディレクトリのどのファイルが変更されたか。
#!/bin/sh
topdir=$HOME # change this to point to the top dir where your files are
stamp="$topdir/timestamp"
if [ -f "$stamp" ]; then
echo 'New files:'
find "$topdir" -type f ! -name timestamp -newer "$stamp"
echo 'Old files:'
find "$topdir" -type f ! -name timestamp ! -newer "$stamp"
fi
date >"$stamp"
これは次のように変更できます。
- ユーザーに古いファイルを削除するように求められます。
- 特定のパターンに一致するファイル(
-name 'pattern'
例:使用-name 'A156.1.[abxyz]'
)のみを検索します。 - 修正時間の代わりにinode変更時間( "ctime")を見てください(サポートされている場合は
-cnewer
代わりに使用)。-newer
find
- など。