เปลี่ยนชื่อไฟล์โดยอัตโนมัติเมื่อวางไว้ในไดเรกทอรีเฉพาะ


14

เป็นไปได้หรือไม่ที่จะเปลี่ยนชื่อไฟล์โดยอัตโนมัติเมื่อวางไว้ในไดเรกทอรีเฉพาะ

ตัวอย่างเช่นฉันมีไดเรกทอรีชื่อ "dir0" ฉันย้ายหรือคัดลอกไฟล์ชื่อ "file1" เป็น "dir0". แล้ว "file1" ควรเปลี่ยนชื่อเป็น "file1_ {timestamp ปัจจุบัน}"


1
ดู inotify ( linux.die.net/man/7/inotify ) แต่คุณไม่สามารถคัดลอกไปยังไฟล์ที่มีชื่ออย่างถูกต้องพร้อมเพิ่มการประทับเวลาทันทีได้หรือไม่
alex

คำตอบ:


21

โดยปกติแล้วคุณจะทำเช่นนี้ programatically ในเวลาที่คุณสร้างหรือย้ายไฟล์ 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การจับคู่รูปแบบที่นี่ Gilles ชี้ให้เห็นวิธีการทำเช่นนี้โดยไม่เรียกใช้ 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`" \;

{} จะถูกแทนที่ด้วยชื่อไฟล์

คำสั่งที่ฉันให้ไว้ไม่สมบูรณ์ - มันทำให้เกิดการวนซ้ำเพราะเมื่อไฟล์จะถูกเปลี่ยนชื่อมันจะถูกรับรู้เป็นใหม่ดังนั้นมันจะได้รับmvอีกครั้งและอีก เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถใช้--suffixตัวเลือกหากคุณรู้ว่าคำต่อท้ายจะอยู่ในไฟล์อะไรก่อนที่จะเปลี่ยนชื่อ


ไม่มีปัญหา. inoticomingผมไม่เคยได้ยิน จากความอยากรู้เมื่อไรจะใช้สิ่งนี้ได้ดีกว่ากันinocron?
Caleb

ฉันไม่รู้ว่ามันดีกว่าหรือเปล่า ฉันเคยได้ยินเรื่องนี้มาแล้ว แต่ฉันไม่เคยลองเลย ... ตอนนี้ฉันพบความคิดเห็นที่inoticoming"คล้ายกับincrondแต่น้ำหนักเบากว่าและไม่เริ่มเป็นภูตเริ่มต้น" ดังนั้นฉันคิดว่ามันเป็นเพียงแนวทางอื่นที่มีวิธีการที่แตกต่างกันเล็กน้อย .. ฉันคิดว่าincronเป็นที่นิยมมากขึ้น - ฉันมีปัญหาเล็กน้อยในการค้นหาinoticoming หน้าแรกแพคเกจสำหรับมันนอก Debian ...
pbm

ฉันคิดว่าคุณเพิ่งโพสต์ลิงก์ผิด distro ของฉันดูเหมือนจะไม่มีที่ใดก็ได้
Caleb

ฉันพบinoticomingเฉพาะในการแจกแจงแบบ Debian เท่านั้น (ใน Gentoo ของฉันไม่มี ebuild สำหรับมัน) บนหน้าเว็บที่ผมโพสต์มีสองแพคเกจ: 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 สามารถทำอะไรก็ได้ แต่สคริปต์ถาวรที่ทำงานบน X-second ในขณะที่จริงเป็นแฮ็คอย่างแน่นอนเมื่อคุณสามารถรับการแจ้งเตือนเหตุการณ์เกี่ยวกับการเขียนไฟล์และตอบสนองทันทีโดยไม่ต้องเสียเวลาที่เหลือ
Caleb

@Caleb - จริงมาก เพียงแค่ให้โอกาส แน่นอนถ้าคุณทำผ่านการแจ้งเตือนระบบคุณมีความเป็นไปได้ที่จะสร้างไฟล์สองไฟล์โดยใช้ชื่อเดียวกันภายในวินาทีเดียวกันดังนั้นสคริปต์ที่แนบควรจัดการกับสถานการณ์เหล่านั้น
ไพเราะ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.