2012-03-10 169 views
1

我在路徑/ home/customers/customer1,/ home/customers/customer2等客戶文件夾中保留了大量(ca 1000)等等。現在客戶來來去去,而且我不想保留在我的工作驅動器中一段時間​​(例如2年)未修改的文件夾。移動包含舊文件的目錄的簡單方法

我需要什麼,是將

一)採取所有候選文件夾,直接(即沒有遞歸子文件夾,因爲我不想要分割客戶數據的簡單腳本)給定的後裔路徑(例如/ home/customers /); b)爲每個文件夾計算最近的修改時間; c)如果一些文件夾(例如/ home/customers/mycustomer231)的修改時間比1年早,則將其移動到指定路徑(例如/ var/backup/oldcustomers)。

實現它的最簡單方法是什麼?

用什麼語言?在Bash? Perl的?蟒蛇?其他一些語言?

我知道Bash的一些基本知識。我知道,有一種方法可以通過將find <..> -exec嵌套在另一個find <..> -exec中並使用this thread的建議來實現它,但是生成的代碼肯定不容易理解和維護。 我也瞭解其他上述語言的一些基本知識,足以瞭解他們的大部分代碼,但沒有足夠的經驗來編寫我自己的解決方案。

(是的,我可以花上一個月+學習其中的一種語言,但是爲了解決我孤立的問題,時間價格太貴了,我相信問題是基本的,在/ home用戶/並清除舊的條目,已經有解決方案的話)

+0

我認爲這項工作可以用這三種語言中的任何一種很容易地完成。 – hochl 2012-03-10 16:15:14

回答

0

完全過度設計相比,使用find + xargs的一個bash一個襯墊,但這裏是一個快速的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

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