Как выразить эту команду Bash в чистом Python - PullRequest
1 голос
/ 23 сентября 2008

У меня есть эта строка в полезном Bash-скрипте, который мне не удалось перевести на Python, где '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

Прежде всего, должен быть лучший способ сделать это, любое предложение приветствуется. В любом случае, например, «AllFiles ('/ users / me / music / itunes / itunes music / podcasts')» выдает соответствующий список в Windows. Предположительно я должен иметь возможность просмотреть этот список и вызвать os.stat (list_member) .st_mtime и переместить все материалы старше определенного числа дней в архив; Я немного застрял в этом.

Конечно, все, что связано с краткостью команды bash, также будет освещено.

Ответы [ 4 ]

5 голосов
/ 23 сентября 2008
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))
3 голосов
/ 23 сентября 2008
import subprocess
subprocess.call(['find', '~/podcasts/current', '-mindepth', '2', '-mtime', '+5',
                 '-exec', 'mv', '{}', '~/podcasts/old', ';'], shell=True)

Это не шутка. Этот скрипт на python будет делать то же самое, что и bash.

РЕДАКТИРОВАТЬ : Удалил обратную косую черту в последнем параметре, потому что он не нужен.

2 голосов
/ 23 сентября 2008

Это не команда Bash, это команда find. Если вы действительно хотите перенести его на Python, это возможно, но вы никогда не сможете написать версию Python, которая была бы такой краткой. find был оптимизирован в течение 20 лет, чтобы быть превосходным в манипулировании файловыми системами, в то время как Python является языком программирования общего назначения.

0 голосов
/ 23 сентября 2008
import os, stat
os.stat("test")[stat.ST_MTIME]

даст вам время. Я предлагаю исправить их в walk_results[2], а затем повторно вызывать функцию для каждого каталога в walk_results[1].

...