2011-02-03 24 views
1

古いファイルからバックアップディレクトリをきれいにし、最新のN個しか残さないスクリプトを作成します。私もlsを使わずにやりたい私は以下のコードになってしまった最新のディレクトリ以外の古いファイルを削除するためのスクリプトN

昨日:GNU拡張せずにすべてのボックスを残して、使用されてfind -printfがあるよう

counter=0 
while IFS=/ read -rd '' time file; do 

     ((counter++ < ${KEEP_NUMBER:?})) && continue 
     rm -f "$file" 

done < <(find . -maxdepth 1 -type f -printf "%[email protected]/%p\0" | sort -znr) 

しかし、これは、すべてで移植性がありません。

このようなタスクを実行する方法はありますか?

+3

'ls'はファイル時間を調べる唯一の標準ツールであるため、プラットフォーム固有の拡張の領域に移動せずに仕事をするのは難しいでしょう。例えば、GNUの 'stat'コマンドは、ファイル時間に関する情報を分析できますが、GNUの' find'よりも移植性が高い(またはそれ以下の)ものではありません。また、 "ファイル名にスペース、タブ、改行、改ページなどが含まれていますか?"という問題/問題があります。特に改行は怒りを引き起こす。 –

答えて

1
あなたが

  • アレイをサポートシェルを持って、比較的容易に設ける行うことができます

    (2つのファイルの年齢を比較することができます)testから

  • アクセス
を( bashはないとして)

これは私の試みです(おそらくファイル名のスペースには対応しませんが、それは十分に簡単に修正できるかもしれません)

#!/bin/bash 

declare -a files 
for file in * 
do 
    files[${#files[@]}]=$file 
done 

# Bubble sort the files from newest to oldest 
declare -i i j count=${#files[@]} 
while true 
do 
    declare -i sorted=1 
    for ((i=1;i<count;i++)) 
    do 
     let j=i-1 
     if [ ${files[$j]} -ot ${files[$i]} ] 
     then 
      sorted=0 
      f=${files[$j]} 
      files[$j]=${files[$i]} 
      files[$i]=$f 
     fi 
    done 
    [ $sorted -eq 1 ] && break 
done 

# Delete everything except the first 5 files 
for ((i=5;i<count;i++)) 
do 
    rm "${files[$i]}" 
done 
0

まあ、findにはPOSIX -newerがあります。それは、いくつかのマイナーコーディングを使用して、ファイルを変更するために使用することができます。私は最初のファイルを取って、新しいものを見つけるような何かをやったでしょう。そこには2つのセットがあります - 新しいものと古いもの。もし新しいファイルがNよりも多い場合は、より新しいセットのプロセスを繰り返します。そうでなければ、新しいセットを覚えています。この番号をNから減算し、古いセットのプロセスを繰り返します。

それとも、アーカイブを作成するpaxを使用して、あなたが望む形式で更新時刻を抽出するために-o listoptを使用することができ、そこには、すべての情報を持っている:)

0

http://www.google.fr/search?q=zfs

...

男rsnapshoot他

...

停止トラインgバックアップのスイートを再構築する

else ...

man find | grep - -ctime man find | grep - -delete

関連する問題