с помощью чего это реализовать? Алгоритм такой: если в директории есть файлы (jpg) переименовываем их по дате создания(+время) и перемещаем их в подкаталог sort иначе ничего не делаем:)
#!/usr/bin/perl -w
# jpgsort.pl
use strict;
use File::Copy;
@ARGV == 1 or die "Usage: jpgsort.pl <dirname>";
my $dirname = $ARGV[0];
my $sortdir = "sort";
chdir $dirname or die "Cannot chdir to $ARGV[0]: $!";
if(not -d $sortdir) {
mkdir $sortdir or die "Cannot mkdir $sortdir: $!";
}
opendir(DIR, ".") or die "Cannot open dir: $!";
while(defined (my $direntry = readdir DIR)) {
next unless -f $direntry and $direntry =~ /\.jpg$/i;
my $mtime = (stat $direntry)[9];
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
= localtime $mtime;
++$mon; $year+=1900;
my $newname = sprintf("%s/%04d-%02d-%02d_%02d:%02d:%02d_%s",
$sortdir, $year, $mon, $mday,
$hour, $min, $sec, $direntry);
move($direntry, $newname)
or die "Cannot move `$direntry' to `$newname': $!";
}
closedir(DIR) or die "Cannot close dir: $!";
# строчки 20-22 можно подредактировать как там тебе надо,
# но перед тем как убирать оттуда $direntry, будь готов, что файлы
# с одинаковым названием будут друг друга затирать. :)
# пиво высылать в Иркутск, до востребования, Teak'у. :)
Я тоже что-то такое сначала нарисовал, но потом подумал что даты в таком виде не очень читаются, а чтоб их сделать более human readable, проще уже на перле. Хотя твой вариант конечно гораздо короче. :)
Но вот убирать оригинальное имя совсем не стоит, как я уже писал. А то из нескольких файлов с одинаковым временем создания выживет только один.
Обалдеть. А я-то думал, что знаю find. :) Спасибо. Хотя тут конечно ещё надо решить проблемы с пробелами и тому подобным в именах файлов, но это уже мелочи.
Где ошибся? Вроде всё верно. Или под ошибкой имеется в виду нерасстановка кавычек вокруг имён файлов? :) Так это как раз нифига не поможет, надо ещё кавычки и бэкслэши внутри этих имён экранировать... Вообще, эта проблема полностью решена из предложенных вариантов только в моём скрипте, почему я для таких вещей обычно перл и пользую... Но если точно знаешь, что все имена файлов "хорошие", тогда конечно твой вариант круче всех. :)
Файлов со * в имени у вас нет! :-)
sdio:~/111$ ls -1
aa "11 ' 44.jpg
script.sed
sdio:~/111$ cat script.sed
s/'/'"'"'/g
s/\*/'/g
... -printf "mv *%p* *%h/%TY-%Tm-%Td+%TH:%TM:%TS_%f*\n" | sed -f script.sed | sh
sdio:~/111$ ls -1 2006-11-17+13:25:37_aa "11 ' 44.jpg
script.sed
Жуть. Но я лично видел даже файлы с переносами строки в имени, не говоря уже обо всяких там табуляциях. :) Так что я предпочитаю свой скриптик, которому на имена файлов вообще пофиг.
А в принципе, в имени файла гарантированно не может быть только двух символов: '\0' и '/'. Так что единственный реальный путь - это всякие там -print0, но это работает только в достаточно простых случаях, а в сложных получается сложнее и запутаннее, чем написать то же самое на перле.
Прокатил твой вариант: find /mmc/mmca1/MyPhoto -name '*.jpg' -printf "mv %p %h/%TY.%Tm.%Td_%TH%TM%TS_%f\n" | sh имена файлов нормальные всегда (moto_001.jpg) как сделать чтобы в MyPhoto И Photo (еще каталоге) сразу "искал" и переименовывал файл не добавляя старое имя файла (т.е. только дату) спасибо
Ну и лучше всё-таки mv -i. :) Хоть топикстартер и сам попросил убирать оригинальное имя, но как известно юзера надо по возможности уберечь от негативных последствий выполнения его желаний. :)
ок работает, только добавил jpg в конец файла find /mmc/mmca1/MyPhoto /ezxlocal/download/mystuff/MyImages -name '*.jpg' -printf "mv %p %h/%TY.%Tm.%Td_%TH%TM%TS.jpg\n" | sh
Еще вопросик по усовершенствованию скрипта: в каталоге /ezxlocal/download/mystuff/MyImages лежит папка Wallpapers, как ее из поиска исключить?, в ней не надо переименовавать