1

14 日以上前のファイル/フォルダーを消去する Web サーバー用のスクリプトを作成する必要がありますが、最後の 7 つのファイル/ディレクトリは保持します。私はこれまで調査を行ってきましたが、ここに私が思いついたものがあります(構文とコマンドが間違っていることは知っていますが、アイデアを得るためだけです):

ls -ldt /data/deployments/product/website.com/*/ | tail -n +8 | xargs find /data/deployments/product/website.com/ -type f -type d -mtime +14 -exec rm -R {} \;

これは、スクリプトがどのように動作するかについての私の思考プロセスです (私はむしろ Windows バッチのやつです)。

ディレクトリの内容を一覧表示する

 If contents is less than or equal to 7, goto END
 If contents is > 7 goto CLEAN
:CLEAN
ls -ldt /data/deployments/product/website.com/*/
keep last 7 entries (tail -n +8)
output of that "tail" -> find -type f -type d (both files and directories) -mtime +14 (not older than 14 days) -exec rm -R (delete)

xargs と sed を使用した例をたくさん見てきましたが、すべてをまとめる方法がわかりません。

4

1 に答える 1

1
#!/bin/bash

find you_dir -mindepth 1 -maxdepth 1 -printf "%T@ %p\n" | \
sort -nrk1,1 |sed '1,7d' | cut -d' ' -f2 | \
xargs -n1 -I fname \
find fname -maxdepth 0 -mtime +14 -exec echo rm -rf {} \;

echo出力に満足している場合は削除します...

説明(行ごと):

  1. find正確に入力してyour_dir、seconds_since_Unix_epoch ( %T@) およびファイル (/dir) 名を各ファイル/ディレクトリの別の行に出力します。
  2. 最初のフィールド (seconds_since_Unix_epoch) で降順に並べ替え、最初の 7 行を捨てて、残りから名前だけを抽出します (2 番目のフィールド)
  3. xargsfind新しいプロセスに引数ごとに ( )を渡し、引数を表すため-n1に使用しますfname
  4. -maxdepth 0だけに制限findするfname

minNrOfFiles と ageLimit を Bash-Variables に保存するか、いくつかの変更を加えてスクリプトに渡すことができます。

minNrOfFiles=7 # or $1
ageLimit=14    # or $2

変更:sed '1,'"$minNrOfFiles"'d'および-mtime +"$ageLimit"

于 2012-08-21T21:00:32.957 に答える