जब वे एक विशिष्ट निर्देशिका में रखे जाते हैं तो स्वचालित रूप से फ़ाइलों का नाम बदलें


14

क्या किसी विशेष निर्देशिका में फ़ाइल को स्वचालित रूप से नाम बदलना संभव है?

उदाहरण के लिए मेरे पास "dir0" नाम की एक निर्देशिका है। मैं "file1" नामक फ़ाइल को "dir0" में स्थानांतरित या कॉपी करता हूं। "फ़ाइल 1" का नाम बदलकर "file1_ {current timestamp}" करना चाहिए।


1
Inotify ( linux.die.net/man/7/inotify ) पर एक नज़र डालें । लेकिन क्या आप अभी जोड़े गए टाइमस्टैम्प के साथ ठीक से नामित फ़ाइल की प्रतिलिपि नहीं बना सकते हैं?
एलेक्स

जवाबों:


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यहां मिलान कैसे करें। गिल्स ने बताया कि ईएआरई का उपयोग करके बैश में जीआरई का उपयोग किए बिना यह कैसे किया जाए:

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

5

मुझे लगता है कि inotifyयह उपकरण है कि इस मामले में कूप का उपयोग किया जाना चाहिए। डेबियन में inoticomingफ़ाइल निर्माण पर कार्रवाई निष्पादित करने के लिए उपकरण है :

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

{} फ़ाइल नाम के साथ बदल दिया जाएगा।

मेरे द्वारा प्रदान की गई कमांड पूर्ण नहीं है - यह एक लूप का कारण बनता है क्योंकि जब फ़ाइल का नाम बदला जाएगा तो इसे नए रूप में पहचाना जाएगा, इसलिए इसे mvएड अगेन और इसी तरह मिलेगा । इससे बचने के लिए आप --suffixविकल्प का उपयोग कर सकते हैं यदि आप जानते हैं कि नाम बदलने से पहले फाइल में क्या प्रत्यय होगा।


कोई दिक्कत नहीं है। मैंने कभी नहीं सुना inoticoming। जिज्ञासा से बाहर, इस ओवर का उपयोग करना कब बेहतर होगा inocron?
कालेब

मुझे नहीं पता कि क्या यह बेहतर है। मैंने इसके बारे में कुछ समय पहले सुना था, लेकिन मैंने कभी इसकी कोशिश नहीं की ... अब मुझे राय मिली कि inoticoming"समान है incrond, लेकिन हल्का वजन और एक डिफ़ॉल्ट डेमन के रूप में शुरू नहीं हुआ है", इसलिए मुझे लगता है कि यह अलग तरह से अलग दृष्टिकोण के साथ सिर्फ एक और समाधान है। .. मुझे लगता है कि incronयह अधिक लोकप्रिय है - मुझे डेबियन के बाहर inoticoming होम पेज के लिए एक पैकेज खोजने में थोड़ी परेशानी होती है ...
pbm

मुझे लगता है कि आपने सिर्फ गलत लिंक पोस्ट किया है। मेरा डिस्ट्रो कहीं भी ऐसा नहीं लगता।
कालेब

मैंने inoticomingकेवल डेबियन आधारित वितरण में पाया (मेरे जेंटू में इसके लिए कोई पुनर्निर्माण नहीं है)। उस पेज पर, जिसे मैंने पोस्ट किया है, उसके दो पैकेज हैं: repreproऔर उसके नीचे inoticoming...
pbm

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 कर सकते हैं, लेकिन एक निरंतर स्क्रिप्ट जो एक्स-सेकंड पर चलता है, जबकि सच्चा लूप निश्चित रूप से एक हैक है जब आप बाकी समय संसाधनों को बर्बाद किए बिना फ़ाइल-राइट के बारे में घटना की सूचनाएं प्राप्त कर सकते हैं और तुरंत प्रतिक्रिया दे सकते हैं।
कालेब

@ कालेब - बहुत सही। सिर्फ संभावनाएं दे रहा है। बेशक, यदि आप इसे सिस्टम नोटिफिकेशन के माध्यम से कर रहे हैं, तो आपके पास एक ही नाम के साथ दो फ़ाइल बनाने की संभावना है जो एक ही सेकंड के भीतर है, इसलिए संलग्न स्क्रिप्ट को उन परिस्थितियों को संभालना चाहिए।
अपराह्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.