Чи можливо автоматично перейменувати файл, коли він розміщений у певному каталозі?
Наприклад, у мене є каталог з назвою "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`" \;
{}
буде замінено на ім'я файлу.
Команда, яку я надав, не є повною - вона спричиняє цикл, оскільки коли файл буде перейменований, він буде розпізнаний як новий, тому він отримає mv
ed 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, безумовно, є злом, коли ви можете отримувати сповіщення про події файлів і відповідати миттєво, не витрачаючи ресурсів решту часу.