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}"
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}"
Câu trả lời:
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 -e
mộ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/script
viế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 bash
hiệ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)"
Tôi nghĩ rằng đó inotify
là 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ị mv
ed LẠI và cứ thế. Để tránh điều này, bạn có thể sử dụng --suffix
tù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.
inoticoming
. Vì tò mò, khi nào nên sử dụng nó hơn inocron
?
inoticoming
là "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 incron
nó 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 ...
inoticoming
chỉ 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: reprepro
và bên dưới nó inoticoming
...
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
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.