cp --backup = được đánh số cho các thư mục


10

Để sao lưu các tệp hiện có với hậu tố số, tôi có thể làm như sau:

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

Nhưng điều này không áp dụng khi tôi cố gắng làm tương tự với một thư mục:

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

Làm thế nào tôi có thể đạt được điều này?


Có lẽ tôi nên chứng minh một chút những gì tôi muốn đạt được. Đầu tiên chúng ta có hai thư mục:

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

Sau đó, chúng tôi làm điều này:

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

Lý tưởng nhất là tôi muốn kết quả này:

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

Chỉ cần một suy nghĩ: Tôi sẽ giải thích " sao lưu " là: "* giữ các ảnh chụp nhanh của các tệp vào những thời điểm nhất định *". Bản thân các thư mục không thay đổi - đó là nội dung của chúng thay đổi. Tôi hiểu câu hỏi của bạn là: " Cách tạo các thư mục được đánh số liên tiếp có chứa các bản sao lưu của các tệp " -> thay vì giữ một thư mục backup.~1~, backup~2~v.v. bạn muốn dir~1~chứa backup~1~, theo sau dir~2~có chứa backup~2~, v.v., do đó theo dõi từng thay đổi trạng thái trong một thư mục riêng. Thê nay đung không?
erch

Câu trả lời:


1

Mặc dù điều này có thể được thực hiện trong bash, nhưng tôi là một người trăn hơn, vì vậy đây là đề xuất của tôi:

#!/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())

1

Thử:

find source -type f -exec cp --backup=numbered -- {} container/ \;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.