Автоматично перейменовувати файли, коли вони розміщуються у певному каталозі


14

Чи можливо автоматично перейменувати файл, коли він розміщений у певному каталозі?

Наприклад, у мене є каталог з назвою "dir0".


1
Погляньте на inotify ( linux.die.net/man/7/inotify ). Але хіба ви не можете просто скопіювати файл у правильно названий файл із доданою часовою маркою?
alex

Відповіді:


21

Зазвичай ви робите це систематично під час створення або переміщення файлу, але сценарій можна запускати, коли файл створюється або переміщується в папку за допомогою 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)"

5

Я думаю, що inotifyце інструмент, який можна використовувати в цьому випадку. У Debian є інструмент inoticomingдля виконання дій по створенню файлів:

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

{} буде замінено на ім'я файлу.

Команда, яку я надав, не є повною - вона спричиняє цикл, оскільки коли файл буде перейменований, він буде розпізнаний як новий, тому він отримає mved AGAIN тощо. Щоб уникнути цього, ви можете використовувати --suffixпараметр, якщо знаєте, який суфікс буде у файлі перед перейменуванням.


Без проблем. Я ніколи не чув inoticoming. З цікавості, коли було б краще скористатися цим inocron?
Калеб

Я не знаю, чи краще. Я чув про це деякий час тому, але ніколи не пробував цього… Тепер я знайшов думку, яка inoticoming«схожа на incrond, але легшу вагу і не почалася як демон за замовчуванням», тому я думаю, що це просто чергове рішення з трохи іншим підходом. .. Я думаю, що incronце більш популярно - у мене мало клопоту знайти inoticoming домашню сторінку пакет для неї поза Debian ...
pbm

Я думаю, ти щойно опублікував неправильне посилання. Моя дистрибуція, схоже, не має її ніде.
Калеб

Я знаходив inoticomingлише в дистрибутивах на базі Debian (у моєму Gentoo для цього немає ebuild). На сторінці, яку я опублікував, є два пакети: repreproа під ним inoticoming...
пбм

2

Ви можете просто взяти такий сценарій і запустити його… Я залишу це як вправу для читача, щоб додати зайві біти, щоб він почався як послуга і не допустив запуску декількох копій одразу.

#!/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, безумовно, є злом, коли ви можете отримувати сповіщення про події файлів і відповідати миттєво, не витрачаючи ресурсів решту часу.
Калеб

@Caleb - Дуже правда. Просто надання можливостей. Звичайно, якщо ви робите це через системне сповіщення, у вас є можливість отримати два створені файли з тим самим іменем протягом однієї секунди, тому додані сценарії повинні вирішувати ці обставини.
unpythonic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.