cp --backup = หมายเลขสำหรับโฟลเดอร์


10

ในการสำรองไฟล์ที่มีอยู่ด้วยคำต่อท้ายตัวเลขฉันสามารถทำสิ่งต่อไปนี้:

cp --backup=numbered afile /path/to/dest

แต่นี่ใช้ไม่ได้เมื่อฉันพยายามทำเช่นเดียวกันกับโฟลเดอร์:

cp -R --backup=numbered afolder /path/to/dest

ฉันจะบรรลุสิ่งนี้ได้อย่างไร


บางทีฉันควรจะแสดงให้เห็นถึงสิ่งที่ฉันต้องการบรรลุ ครั้งแรกเรามี dirs สอง:

ls -ld source container
drwxrwxr-x 6 kaiyin kaiyin 4096 Nov 29 22:11 container
drwxrwxr-x 2 kaiyin kaiyin 4096 Nov 29 22:09 source

จากนั้นเราทำสิ่งนี้:

myPerfectCp -R --backup=numbered source container/
myPerfectCp -R --backup=numbered source container/
myPerfectCp -R --backup=numbered source container/
myPerfectCp -R --backup=numbered source container/

โดยหลักการแล้วฉันต้องการผลลัพธ์นี้:

tree container/
container/
├── source
├── source.~1~
├── source.~2~
└── source.~3~

เป็นเพียงความคิด: ฉันจะอธิบาย " สำรอง " เป็น: "* เก็บภาพรวมของไฟล์ในบางช่วงเวลา *" ไดเร็กตอรี่เองไม่เปลี่ยนแปลง - มันคือเนื้อหาที่เปลี่ยนแปลง ผมเข้าใจคำถามของคุณเป็น " วิธีการสร้างไดเรกทอรีหมายเลขติดต่อกันที่มีการสำรองข้อมูลของไฟล์ " -> แทนการรักษาไดเรกทอรีbackup.~1~, backup~2~ฯลฯ ที่คุณต้องการdir~1~มีbackup~1~ตามdir~2~ที่มีbackup~2~และอื่น ๆ ดังนั้นการติดตามการเปลี่ยนแปลงของรัฐในแต่ละไดเรกทอรีที่แยกต่างหาก ถูกต้องหรือไม่
erch

คำตอบ:


1

แม้ว่าสิ่งนี้สามารถทำได้ในทุบตีฉันเป็นงูหลามมากขึ้นดังนั้นนี่คือข้อเสนอของฉัน:

#!/usr/bin/env python
import glob
import os
import sys


def cpdir(source, target):
    if target.endswith('/'):
        if not os.path.isdir(target):
            print "Target directory doesn't exist: %s" % target
            sys.exit(1)
        target += source
    if '--backup=numbered' in sys.argv:
        dirs = glob.glob(target + '.~*~')
        if not dirs:
            num = 1
        else:
            num = max([int(dir.split('~')[-2]) for dir in dirs]) + 1
        target += '.~%s~' % num
    cmd = 'cp -a %s %s' % (source, target)
    #print cmd
    rv = os.system(cmd)
    sys.exit(rv)

def main():
    if len(sys.argv) < 3:
        print "Usage: %s [--backup=numbered] <source> <dest>" % sys.argv[0]
        sys.exit(1)
    source = sys.argv[1]
    target = sys.argv[2]
    return cpdir(source, target)

if __name__ == '__main__':
    sys.exit(main())

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.