2012-03-10 6 views
1

私は、/ home/customers/customer1、/ home/customers/customer2などのパスに多くの顧客のフォルダを保持しています。私は作業中のドライブである程度の時間(例えば2年)修正されていないフォルダを保持したくない。私は必要なもの古いファイルを含むディレクトリを移動する簡単な方法

は、

a)すべての候補のフォルダを取る即時として(すなわちサブフォルダに再帰なし、と私は顧客のデータを分割したくないでしょう簡単なスクリプト)与えられたの子孫でありますパス(例:/ home/customers /)。

b)各フォルダについて、最新の変更時刻を計算します。

c)一部のフォルダ(/ home/customers/mycustomer231など)の変更時間が1年より古い場合は、指定したパス(/ var/backup/oldcustomersなど)に移動します。

これを実装する最も簡単な方法は何ですか?

どの言語でですか?バッシュで? Perl? Python?いくつかの他の言語ですか?

私はBashの基本を知っています。 を別のものの中に入れ、this threadのアドバイスを使用してそれを達成する方法があることはわかっていますが、結果のコードは理解しやすく維持しにくいでしょう。 私はまた、他の言及された言語のいくつかの基本を知っていますが、コードの大部分を理解するのに十分ですが、私自身の解決策を書くのに十分な経験はありません。

(はい、私は月間+これらの言語の1つを学ぶことができましたが、私の孤立した問題を解決するために、時間の価格はあまりにも大事です。 。すべてのディレクトリを見つけるために家/内のユーザ/と古いエントリをパージして、すでにそのためのソリューションを持っている)

+0

私はこの仕事は3つの言語のどれでも簡単に行うことができると思います。 – hochl

答えて

0

完全overengineeredが、ここでは、部分的に、私が以前に書いたいくつかの他のスクリプトからマッシュアップ、迅速なPythonスクリプトです。あなたの目的のために非常にうまくいくはずです。 、私は努力も価値がこれらの言語

そののいずれかを学習ヶ月+過ごすことができ、

はい:

は今、私は努力に行った唯一の理由は、あなたが作ったというコメントであります非常に迅速に支払いをします。 このスクリプトでは、いくつかのテストを含む約7分かかりました。

#!/usr/bin/python 
import datetime 
import os 
import sys 
import shutil 

SOURCE_PATH = "/home/customers/" 
TARGET_PATH = "/home/oldcustomers/" 
TIME_THRESHOLD = datetime.timedelta(365) #days 

def get_old_dirs(source_path, time_threshold): 
    old_dirs = [] 
    for root, dirs, files in os.walk(source_path): 
     for d in dirs: 
      full_path = os.path.join(root, d) 
      now = datetime.datetime.now() 
      last_modified = datetime.datetime.fromtimestamp(os.stat(full_path).st_mtime) 
      delta = now - last_modified 
      if (delta) >= time_threshold: 
       old_dirs.append((full_path, delta)) 
     break 
    return old_dirs 

def move_old_dirs(target_path, source_path, time_threshold, confirm=True): 
    dirs = get_old_dirs(source_path, time_threshold) 
    print '"old" dirs: %d' % len(dirs) 
    if dirs: 
     if confirm: 
      print "pending moves:" 
      for (d, delta) in dirs: 
       print "[%s days] %s" % (str(delta.days).rjust(4), d) 
      if not raw_input("Move %d directories to %s ? [y/n]: " % (len(dirs), target_path)).lower() in ['y', 'yes']: 
       return 
     if not os.path.exists(target_path): 
      os.makedirs(target_path) 
     for (d, delta) in dirs: 
      shutil.move(d, target_path) 
      print "%s -> %s" % (d, target_path) 
     print "moved %d directories" % len(dirs) 


def cmdline(args): 
    from optparse import OptionParser 
    usage = "move_old_dirs [options] <source_dir> <target_dir>" 
    default_desc = "%s -> %s [%s]" % (SOURCE_PATH, TARGET_PATH, TIME_THRESHOLD) 
    parser = OptionParser(usage) 
    parser.add_option("-d", "--days", 
         action="store", type="int", dest="days", default=365, 
         help="How many days old the directory must be to move") 
    parser.add_option("--default", default=False, 
        action="store_true", dest="default", 
        help="Run the default values set in the script: (%s)" % default_desc) 
    parser.add_option("-f", "--force", default=False, 
        action="store_true", dest="force", 
        help="Dont ask for confirmation") 
    (options, args) = parser.parse_args(args) 
    if len(args) == 1 and options.default: 
     print "running default: %s" % default_desc 
     return move_old_dirs(TARGET_PATH, SOURCE_PATH, TIME_THRESHOLD, confirm=(not options.force)) 
    elif len(args) == 3: 
     return move_old_dirs(args[2], args[1], datetime.timedelta(options.days), confirm=(not options.force)) 
    print usage 
    print "incorrect number of arguments, try -h or --help" 
    return 1 

if __name__ == "__main__": 
    cmdline(sys.argv) 

だけで、PATH内(move_old_dirsのような)いくつかのファイルに行くを実行可能とするために持ってchmodコマンドをそのチャック。

1

が365日前に変更:

$ find /home/customers -maxdepth 1 -type d -mtime +365 -exec stat -c '%y %n' {} \; 

新しい場所に移動するには:

$ find /home/customers -maxdepth 1 -type d -mtime +365 -exec mv {} /var/backup/oldcustomers \; 
0

あなたはfindを使用することができます:検索+のxargsのを使用してbashの1つのライナーに比べ

find /home/customers -maxdepth 1 -type d -mtime +365 -exec mv '{}' /var/backup/oldcustomers/ \; 
関連する問題