1

Python に変換できなかった便利な Bash スクリプトに次の行があります。「a」は、アーカイブするファイルのユーザー入力日数です。

find ~/podcasts/current -mindepth 2 -mtime '+`a`+' -exec mv {} ~/podcasts/old \;

私は、最も一般的なクロスプラットフォーム要素の os.name と getpass.getuser に精通しています。~/podcasts/current に相当するすべてのファイルの完全な名前のリストを生成するこの関数もあります。

def AllFiles(filepath, depth=1, flist=[]):
    fpath=os.walk(filepath)
    fpath=[item for item in fpath]
    while depth < len(fpath):
        for item in fpath[depth][-1]:
            flist.append(fpath[depth][0]+os.sep+item)
        depth+=1
    return flist

まず、それを行うためのより良い方法があるはずです。どんな提案も歓迎します。どちらの方法でも、たとえば、Windows では "AllFiles('/users/me/music/itunes/itunes music/podcasts')" で関連するリストが表示されます。おそらく、このリストを調べて os.stat(list_member).st_mtime を呼び出し、特定の日数より古いすべてのものをアーカイブに移動できるはずです。私はそのビットに少し立ち往生しています。

もちろん、bash コマンドの簡潔さを備えたものはすべて照明にもなります。

4

4 に答える 4

5
import os
import shutil
from os import path
from os.path import join, getmtime
from time import time

archive = "bak"
current = "cur"

def archive_old_versions(days = 3):
    for root, dirs, files in os.walk(current):
        for name in files:
            fullname = join(root, name)
            if (getmtime(fullname) < time() - days * 60 * 60 * 24):
                shutil.move(fullname, join(archive, name))
于 2008-09-23T02:39:18.447 に答える
3
import subprocess
subprocess.call(['find', '~/podcasts/current', '-mindepth', '2', '-mtime', '+5',
                 '-exec', 'mv', '{}', '~/podcasts/old', ';'], shell=True)

それは冗談ではありません。この python スクリプトは、bash スクリプトとまったく同じことを行います。

編集:必要ないため、最後のパラメーターにバックスラッシュを削除しました。

于 2008-09-23T03:05:37.027 に答える
2

これは Bash コマンドではなく、findコマンドです。本当に Python に移植したい場合は可能ですが、これほど簡潔な Python バージョンを作成することはできません。findPython は汎用プログラミング言語ですが、20 年以上にわたって最適化され、ファイルシステムの操作に優れています。

于 2008-09-23T01:34:37.447 に答える
0
import os, stat
os.stat("test")[stat.ST_MTIME]

mtime が表示されます。でそれらを修正してwalk_results[2]から、再帰的に の各ディレクトリの関数を呼び出すことをお勧めしwalk_results[1]ます。

于 2008-09-23T01:38:31.870 に答える