Чи можливо автоматично перейменувати файл, коли він розміщений у певному каталозі?
Наприклад, у мене є каталог з назвою "dir0".
Чи можливо автоматично перейменувати файл, коли він розміщений у певному каталозі?
Наприклад, у мене є каталог з назвою "dir0".
Відповіді:
Зазвичай ви робите це систематично під час створення або переміщення файлу, але сценарій можна запускати, коли файл створюється або переміщується в папку за допомогою incron. Налаштуйте файл вкладки, використовуючи incrontab -eтакий рядок, але звичайно:
/path/to/dir0 IN_MOVED_TO,IN_CREATE /path/to/script $@/$#
Потім в /path/to/scriptпишіть операцію швидкого перейменування. Майте на увазі, що сценарій також буде викликаний для нового файлу, який ви створюєте, тому він повинен перевірити, чи файл був названий належним чином чи ні. У цьому прикладі він перевіряє, чи є у файлу десятизначне число за секунди від епохи як остання частина імені файлу, а якщо ні, додає його:
#!/bin/bash
echo $1 | grep -qx '.*_[0-9]\{10\}' || mv "$1" "$1_$(date +%s)"
Редагувати: Коли я вперше написав це, мені не вистачало часу і не міг зрозуміти, як зробити bashузгодження шаблону тут. Гілл зазначив, як це зробити, не викликаючи grep, використовуючи відповідність ERE у bash:
#!/bin/bash
[[ ! ( $1 =~ _[0-9]{10}$ ) ]] && mv "$1" "$1_$(date +%s)"
Я думаю, що inotifyце інструмент, який можна використовувати в цьому випадку. У Debian є інструмент inoticomingдля виконання дій по створенню файлів:
inoticoming --foreground /path/to/directory mv {} {}-"`date`" \;
{} буде замінено на ім'я файлу.
Команда, яку я надав, не є повною - вона спричиняє цикл, оскільки коли файл буде перейменований, він буде розпізнаний як новий, тому він отримає mved AGAIN тощо. Щоб уникнути цього, ви можете використовувати --suffixпараметр, якщо знаєте, який суфікс буде у файлі перед перейменуванням.
inoticoming. З цікавості, коли було б краще скористатися цим inocron?
inoticoming«схожа на incrond, але легшу вагу і не почалася як демон за замовчуванням», тому я думаю, що це просто чергове рішення з трохи іншим підходом. .. Я думаю, що incronце більш популярно - у мене мало клопоту знайти inoticoming домашню сторінку пакет для неї поза Debian ...
inoticomingлише в дистрибутивах на базі Debian (у моєму Gentoo для цього немає ebuild). На сторінці, яку я опублікував, є два пакети: repreproа під ним inoticoming...
Ви можете просто взяти такий сценарій і запустити його… Я залишу це як вправу для читача, щоб додати зайві біти, щоб він почався як послуга і не допустив запуску декількох копій одразу.
#!/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);
}
І ось це працює:
$ 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 можна зробити що завгодно, але стійкий скрипт, який працює на X-секундному циклі while-true, безумовно, є злом, коли ви можете отримувати сповіщення про події файлів і відповідати миттєво, не витрачаючи ресурсів решту часу.