2008-09-16 12 views
4

親ディレクトリの4つの最新ディレクトリ以外のすべてを削除します。あなたはこれをBashでどうやってやりますか?4つの最新ディレクトリ以外のすべてを削除

+0

ファイルやディレクトリの作成時刻は、どこにも保存されていないため、取得することはできません。最も近いのはinode変更時間です:http://www.faqs.org/faqs/unix-faq/faq/part3/section-1.htmlディレクトリにファイルを追加または削除すると、inodeが変更されます。 –

+0

...子ディレクトリからファイルを追加または削除すると、親のinodeは変更されません。 –

答えて

9
ls -atrd */ | head --lines=-4 | xargs rm -rf 

編集:あなたが4つ以外のすべて(ファイルやディレクトリ)を意味し、「すべてのディレクトリが、4つのnewstものを削除」または」削除した場合は「」引数は明確にしてください

+0

これは最近作成された4つのものの代わりに4つの最も最近変更されたディレクトリを残し、ドットで始まるディレクトリに気付かず、改行を含む名前で頭が壊れ、空白を含む名前に対してxargsが壊れ、rmはエラーメッセージを表示する削除するものがない場合 –

+0

良い点。私はlsにドットをつけてディレクトリを取得するために 'a'を追加し、現在のディレクトリと親ディレクトリを取り除くためにgreppedしましたが、あなたは正しいです。これはあなたが指摘しているように、いくつかの重要な制限がある簡単な答えです。 –

+0

修正:ls * /で表示されていない現在のディレクトリと親ディレクトリをフィルタリングするためにgrepは必要ありません。 –

1

をLSに追加最新のディレクトリ "です。

作成時間はディレクトリでは分かりません。ディレクトリが最後に変更されたとき、つまりファイルが追加、削除、または名前変更されたときだけを伝えることができます。

1

あなたが行うことができ、以下:

#!/bin/bash 

#store the listing of current directory in var 
mydir=`ls -t` 
it=1 

for file in $mydir 
    do 
     if [ $it -gt 5 ] 
     then 
      echo file $it will be deleted: $file 
      #rm -rf $file 
     fi 
     it=$((it+1)) 
    done 

は(それが本当に実現するために、RMの前に#を削除;)アレイと、それを行うには)

0

別、BSD-安全、道を(理由

#!/bin/bash 
ARRAY=(`ls -td */`) 
ELEMENTS=${#ARRAY[@]} 
COUNTER=4 
while [ $COUNTER -lt $ELEMENTS ]; do 
    echo ${ARRAY[${COUNTER}]} 
    let COUNTER=COUNTER+1 
done 
関連する問題