我在路径/ home / customers / customer1,/ home / customers / customer2等中维护了很多(约1000个)客户的文件夹,等等。现在客户来来往往,我不想保留在我工作的驱动器中未被修改一段时间(例如2年)的文件夹。
我需要的是一个简单的脚本
a)将所有候选文件夹立即(即不递归子文件夹,因为我不想拆分客户的数据)给定路径的后代(例如/ home / customers /);
b)为每个文件夹计算最近的修改时间;
c)如果某个文件夹(例如/ home / customers / mycustomer231)的修改时间早于1年,则将其移至指定路径(例如/ var / backup / oldcustomers)。
实施它的最简单方法是什么?
用什么语言?在Bash? Perl的?蟒蛇?其他一些语言?
我了解Bash的一些基础知识。我知道,有一种方法可以通过将find <..> -exec
嵌套在另一个{{1}}内并使用来自this thread的建议来实现它,但结果代码肯定不易理解和维护。
我也了解其他语言的一些基础知识,足以理解他们的大部分代码,但没有足够的经验来编写我自己的解决方案。
(是的,我可以花上一个月的时间来学习其中一种语言,但是为了解决我孤立的问题,时间上的价格太高了。我敢肯定,这个问题是基本的,而且专业人士也是如此/ home /中的用户正在清除旧条目,已经有了解决方案。)
答案 0 :(得分: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 \;
答案 1 :(得分:0)
您可以使用find
:
find /home/customers -maxdepth 1 -type d -mtime +365 -exec mv '{}' /var/backup/oldcustomers/ \;
答案 2 :(得分:0)
与使用find + xargs的bash one liner相比完全过度设计,但这里是一个快速的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到可执行文件并且可以使用。