rename file based on file's timestamp
Karl Vogel
vogelke at pobox.com
Wed Oct 24 16:58:35 PDT 2007
>> On Wed, 24 Oct 2007 22:45:08 +1000,
>> andrew clarke <ozzmosis at gmail.com> said:
A> I have a series of files in a directory:
A> -rw-r--r-- 1 ozzmosis ozzmosis 115201253 Jul 28 2006 209.mp3
A> -rw-r--r-- 1 ozzmosis ozzmosis 115201253 Jul 31 2006 212.mp3
A> Now I want to rename these so the new filenames are based on the file's
A> timestamp, like so:
A> -rw-r--r-- 1 ozzmosis ozzmosis 115201253 Jul 28 2006 2006-07-28.mp3
A> -rw-r--r-- 1 ozzmosis ozzmosis 115201253 Jul 31 2006 2006-07-31.mp3
A> I can write some Python code to do this, but maybe there is another way,
A> perhaps using a shell script. Any thoughts?
The script below is in Perl, but converting it to Python probably wouldn't
be too difficult.
--
Karl Vogel I don't speak for the USAF or my company
Loch Ness monster surfaces in Jersey bathtub --Weekly World News headline
---------------------------------------------------------------------------
#!/usr/bin/perl -w
# Rename each regular file in the argument list using its modtime.
# Add the inode number if that's not enough to create a unique file.
use strict;
foreach my $file (@ARGV) {
# sanity checks.
next unless -f $file;
my ($inode, $mtime) = (stat(_))[1, 9];
die "$file: no mtime found\n" unless defined($mtime);
# any file extension?
my $ext = '';
$ext = "$1" if $file =~ m/(\.\w*)$/;
# try date.extension, date.inode.extension, then give up.
my ($day, $mon, $year) = (localtime($mtime))[3, 4, 5];
my $date = sprintf("%4.4d-%2.2d-%2.2d", $year + 1900, $mon + 1, $day);
my $newfile = $date . $ext;
if (-f $newfile) {
$newfile = $date . '.' . $inode . $ext;
}
if (-f $newfile) {
warn "unable to rename $file\n";
}
else {
unless (rename($file, $newfile)) {
warn "rename $file to $newfile failed: $!\n";
}
}
}
exit(0);
More information about the freebsd-questions
mailing list