Tự động đổi tên tập tin khi chúng được đặt trong một thư mục cụ thể


14

Có thể tự động đổi tên một tệp khi nó được đặt trong một thư mục cụ thể không?

Ví dụ: tôi có một thư mục có tên "dir0". Tôi di chuyển hoặc sao chép tệp có tên "file1" sang "dir0" .then "file1" nên đổi tên thành "file1_ {dấu thời gian hiện tại}"


1
Hãy xem inotify ( linux.die.net/man/7/inotify ). Nhưng bạn không thể sao chép vào tập tin được đặt tên đúng với dấu thời gian được thêm ngay lập tức?
alex

Câu trả lời:


21

Thông thường bạn sẽ làm điều này theo chương trình tại thời điểm bạn tạo hoặc di chuyển tệp, nhưng có thể kích hoạt tập lệnh bất cứ khi nào tệp được tạo hoặc di chuyển đến thư mục bằng cách sử dụng incron. Thiết lập tệp tab của bạn bằng cách sử dụng incrontab -emột dòng như thế này, nhưng với đường dẫn của khóa học:

/path/to/dir0 IN_MOVED_TO,IN_CREATE /path/to/script $@/$#

Sau đó /path/to/scriptviết một hành động đổi tên nhanh chóng. Xin lưu ý rằng tập lệnh cũng sẽ được gọi cho tệp mới mà bạn tạo, vì vậy nó phải kiểm tra xem tệp đã được đặt tên thích hợp hay chưa. Trong ví dụ này, nó kiểm tra xem liệu tệp có số mười chữ số trong vài giây từ epoch là phần cuối của tên tệp hay không và nếu không, nó sẽ thêm vào:

#!/bin/bash
echo $1 | grep -qx '.*_[0-9]\{10\}' || mv "$1" "$1_$(date +%s)"

Chỉnh sửa: Khi tôi lần đầu tiên viết bài này, tôi rất ít thời gian và không thể tìm ra cách thực bashhiện mô hình khớp ở đây. Gilles đã chỉ ra cách thực hiện việc này mà không cần gọi grep bằng cách sử dụng kết hợp ERE trong bash:

#!/bin/bash
[[ ! ( $1 =~ _[0-9]{10}$ ) ]] && mv "$1" "$1_$(date +%s)"

5

Tôi nghĩ rằng đó inotifylà công cụ mà coul được sử dụng trong trường hợp này. Trong Debian có công cụ inoticomingđể thực hiện hành động tạo tệp:

 inoticoming --foreground /path/to/directory mv {} {}-"`date`" \;

{} sẽ được thay thế bằng tên tệp.

Lệnh mà tôi cung cấp không hoàn thành - nó gây ra một vòng lặp bởi vì khi tệp được đổi tên, nó sẽ được nhận dạng là mới vì vậy nó sẽ bị mved LẠI và cứ thế. Để tránh điều này, bạn có thể sử dụng --suffixtùy chọn nếu bạn biết hậu tố nào sẽ có trong tệp trước khi đổi tên.


Không vấn đề gì. Tôi chưa bao giờ nghe nói về inoticoming. Vì tò mò, khi nào nên sử dụng nó hơn inocron?
Caleb

Tôi không biết nếu nó tốt hơn. Tôi đã nghe về nó một thời gian trước đây, nhưng tôi chưa bao giờ thử nó ... Bây giờ tôi thấy ý kiến ​​đó inoticominglà "tương tự incrond, nhưng trọng lượng nhẹ hơn và không bắt đầu như một daemon mặc định", vì vậy tôi nghĩ đó chỉ là một giải pháp khác với cách tiếp cận hoàn toàn khác. .. Tôi nghĩ rằng incronnó phổ biến hơn - Tôi gặp khó khăn khi tìm inoticoming trang chủ một gói cho nó bên ngoài Debian ...
pbm

Tôi nghĩ rằng bạn chỉ cần đăng liên kết sai. Bản phân phối của tôi dường như không có nó ở bất cứ đâu.
Caleb

Tôi inoticomingchỉ tìm thấy trong các bản phân phối dựa trên Debian (trong Gentoo của tôi không có ebuild cho nó). Trên trang mà tôi đã đăng có hai gói: repreprovà bên dưới nó inoticoming...
pbm

2

Bạn chỉ có thể lấy một tập lệnh như thế này và chạy nó ... Tôi sẽ để nó như một bài tập để người đọc thêm các bit bổ sung để nó bắt đầu như một dịch vụ và ngăn nhiều bản sao chạy cùng một lúc.

#!/usr/bin/perl
use strict;
use warnings;
use File::Slurp;
use POSIX qw(strftime);

chdir($ENV{STAMP_DIR} || '/home/me/dir0')
    or die "Cannot get to stamp dir: $!\n";

while (1) {
    my $stamp = strftime("_%Y%m%d%H%M%S", localtime);
    for my $orig ( grep { $_ !~ /_\d{14}$/ } read_dir('.') ) {
        rename $orig, "$orig$stamp"
            or warn "Failed to rename $orig to $orig$stamp: $!\n";
    }
    sleep($ENV{STAMP_DELAY} || 10);
}

Và đây là nó hoạt động:

$ STAMP_DIR=/home/me/stamps STAMP_DELAY=1 ./t.pl &
[1] 6989
$ cd stamps/
$ ls
$ touch hello
$ ls
hello_20110704033253
$ touch world
$ ls
hello_20110704033253
world_20110704033258
$ touch hello
$ ls
hello_20110704033253
hello_20110704033302
world_20110704033258

Tất nhiên perl có thể làm bất cứ điều gì, nhưng một tập lệnh liên tục chạy trên vòng lặp X-giây trong khi thực sự chắc chắn là một hack khi bạn có thể nhận thông báo sự kiện về ghi tệp và trả lời ngay lập tức mà không lãng phí tài nguyên trong thời gian còn lại.
Caleb

@Caleb - Rất đúng. Chỉ cần đưa ra khả năng. Tất nhiên, nếu bạn đang thực hiện thông qua hệ thống thông báo, bạn có khả năng nhận được hai tệp được tạo cùng tên trong cùng một giây, vì vậy các tập lệnh đính kèm sẽ xử lý các trường hợp đó.
unpythonic
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.