フムを削除します。ナディアの答えはあなたに近いです。はを意味します。しかし、ツリーに(シングル)最も古いファイルを見つけるために、これを試してみてください。
import os, heapq
def oldest_files_in_tree(rootfolder, count=1, extension=".avi"):
return heapq.nsmallest(count,
(os.path.join(dirname, filename)
for dirname, dirnames, filenames in os.walk(rootfolder)
for filename in filenames
if filename.endswith(extension)),
key=lambda fn: os.stat(fn).st_mtime)
:
import os
def oldest_file_in_tree(rootfolder, extension=".avi"):
return min(
(os.path.join(dirname, filename)
for dirname, dirnames, filenames in os.walk(rootfolder)
for filename in filenames
if filename.endswith(extension)),
key=lambda fn: os.stat(fn).st_mtime)
を少し変更して、あなたは(ナディアの回答に似ています)n
最も古いファイルを取得することができます
oldest_files_in_tree("/home/user", 20, (".avi", ".mov"))
つ以上の拡張子を選択する:.endswith
メソッドを使用するなどの通話ができることに注意してください。
最後に、あなたは修正時間順ファイルの完全なリストを、望むならば、空きスペースに必要な数を削除するために、ここでいくつかのコードです:
import os
def files_to_delete(rootfolder, extension=".avi"):
return sorted(
(os.path.join(dirname, filename)
for dirname, dirnames, filenames in os.walk(rootfolder)
for filename in filenames
if filename.endswith(extension)),
key=lambda fn: os.stat(fn).st_mtime),
reverse=True)
ノートreverse=True
がもたらすが、リストの末尾にある最も古いファイルを削除して、次のファイルを削除するには、file_list.pop()
を実行します。
import os
def free_space_up_to(free_bytes_required, rootfolder, extension=".avi"):
file_list= files_to_delete(rootfolder, extension)
while file_list:
statv= os.statvfs(rootfolder)
if statv.f_bfree*statv.f_bsize >= free_bytes_required:
break
os.remove(file_list.pop())
statvfs.f_bfree
は、デバイスの空きブロックであり、
statvfs.f_bsize
は次のとおりです。ところで
、あなたの問題を完全に解決するために、あなたはos.statvfs
が利用可能なLinuxでは、上で実行されているので、あなたが行うことができますブロックサイズ。我々はrootfolder
statvfsを取るので、実際にこのデバイスのスペースを解放せずに多くのファイルを削除できる他のデバイスを指し示すシンボリックリンクに気をつけてください。 (フアンによるコメントをコピー)
UPDATE:OSやファイルシステムの実装に応じて
、あなたはf_frsizeではなくf_bsizeでf_bfreeを乗算することをお勧めします。いくつかの実装では、後者が優先I/O要求サイズです。例えば、私がテストしたばかりのFreeBSD 9システムでは、f_frsizeは4096、f_bsizeは16384でした。POSIXでは、ブロック数フィールドは "f_frsizeの単位"です(http://pubs.opengroup.org/onlinepubs/9699919799//basedefs/sys_statvfs.h.html参照)。
どのように空き領域を得るためにduを使用していますか?それはAFAIKの使い方だけを示しています。 –
申し訳ありませんが、dhではありません。 –
あなたはdfではないと確信していますか? :P –