เป็นไปได้หรือไม่ที่จะเปลี่ยนชื่อไฟล์โดยอัตโนมัติเมื่อวางไว้ในไดเรกทอรีเฉพาะ
ตัวอย่างเช่นฉันมีไดเรกทอรีชื่อ "dir0" ฉันย้ายหรือคัดลอกไฟล์ชื่อ "file1" เป็น "dir0". แล้ว "file1" ควรเปลี่ยนชื่อเป็น "file1_ {timestamp ปัจจุบัน}"
เป็นไปได้หรือไม่ที่จะเปลี่ยนชื่อไฟล์โดยอัตโนมัติเมื่อวางไว้ในไดเรกทอรีเฉพาะ
ตัวอย่างเช่นฉันมีไดเรกทอรีชื่อ "dir0" ฉันย้ายหรือคัดลอกไฟล์ชื่อ "file1" เป็น "dir0". แล้ว "file1" ควรเปลี่ยนชื่อเป็น "file1_ {timestamp ปัจจุบัน}"
คำตอบ:
โดยปกติแล้วคุณจะทำเช่นนี้ 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)"
ฉันคิดว่านั่นinotify
เป็นเครื่องมือที่ใช้ในกรณีนี้ ใน Debian มีเครื่องมือinoticoming
สำหรับดำเนินการกับการสร้างไฟล์:
inoticoming --foreground /path/to/directory mv {} {}-"`date`" \;
{}
จะถูกแทนที่ด้วยชื่อไฟล์
คำสั่งที่ฉันให้ไว้ไม่สมบูรณ์ - มันทำให้เกิดการวนซ้ำเพราะเมื่อไฟล์จะถูกเปลี่ยนชื่อมันจะถูกรับรู้เป็นใหม่ดังนั้นมันจะได้รับmv
อีกครั้งและอีก เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถใช้--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-second ในขณะที่จริงเป็นแฮ็คอย่างแน่นอนเมื่อคุณสามารถรับการแจ้งเตือนเหตุการณ์เกี่ยวกับการเขียนไฟล์และตอบสนองทันทีโดยไม่ต้องเสียเวลาที่เหลือ