LINUX.ORG.RU

#!/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'у. :)

Teak ★★★★★
()

Если это фотки с EXIF, то есть соотв. утилит.

sdio ★★★★★
()

shell?

find . -maxdepth 1 -name "*.jpg" | { while read f; do mkdir -p sort ; cp $f sort/$(stat -c %y $f | cut -b -19 | sed -e 's/[ :]/-/g').jpg ; done }

giga
()
Ответ на: комментарий от giga

Я тоже что-то такое сначала нарисовал, но потом подумал что даты в таком виде не очень читаются, а чтоб их сделать более human readable, проще уже на перле. Хотя твой вариант конечно гораздо короче. :)

Но вот убирать оригинальное имя совсем не стоит, как я уже писал. А то из нескольких файлов с одинаковым временем создания выживет только один.

Teak ★★★★★
()
Ответ на: комментарий от sdio

Обалдеть. А я-то думал, что знаю find. :) Спасибо. Хотя тут конечно ещё надо решить проблемы с пробелами и тому подобным в именах файлов, но это уже мелочи.

Teak ★★★★★
()

wow! респект всем кто ответил!! буду пробовать, вообще надо глянуть есть ли по умолчанию в телефоне перл...) через bash надо p.s. exif есть

anonymous
()
Ответ на: комментарий от sdio

Где ошибся? Вроде всё верно. Или под ошибкой имеется в виду нерасстановка кавычек вокруг имён файлов? :) Так это как раз нифига не поможет, надо ещё кавычки и бэкслэши внутри этих имён экранировать... Вообще, эта проблема полностью решена из предложенных вариантов только в моём скрипте, почему я для таких вещей обычно перл и пользую... Но если точно знаешь, что все имена файлов "хорошие", тогда конечно твой вариант круче всех. :)

Teak ★★★★★
()
Ответ на: комментарий от Teak

> -printf "mv %p %TY-%Tm-%Td+%TH:%TM:%TS_%p\n"

mv /dir/file.jpg <DATE>_/dir/file.jpg
----------------------------------------------------
Надо:
-printf "mv %p %h/%TY-%Tm-%Td+%TH:%TM:%TS_%f\n"

mv /dir/file.jpg /dir/<DATE>_file.jpg

sdio ★★★★★
()
Ответ на: комментарий от sdio

А, ну да. :) Я просто шеллу вывод не скармливал, только глазами посмотрел и не заметил. Но я же про другое говорил.

Teak ★★★★★
()
Ответ на: комментарий от sdio

sdio:~$ mkdir 111
sdio:~$ cd 111
sdio:~/111$ touch 'aa 11.jpg' 
sdio:~/111$ touch 'aa 22.jpg'
sdio:~/111$ touch 'aa 33.jpg'
sdio:~/111$ find . -name '*.jpg' -printf "mv '%p' '%h/%TY-%Tm-%Td+%TH:%TM:%TS_%f'\n" | sh
sdio:~/111$ ls
2006-11-17+13:01:51_aa 11.jpg  2006-11-17+13:01:57_aa 33.jpg
2006-11-17+13:01:54_aa 22.jpg

sdio ★★★★★
()
Ответ на: комментарий от Teak

Файлов со * в имени у вас нет! :-)

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

sdio ★★★★★
()
Ответ на: комментарий от sdio

Жуть. Но я лично видел даже файлы с переносами строки в имени, не говоря уже обо всяких там табуляциях. :) Так что я предпочитаю свой скриптик, которому на имена файлов вообще пофиг.

А в принципе, в имени файла гарантированно не может быть только двух символов: '\0' и '/'. Так что единственный реальный путь - это всякие там -print0, но это работает только в достаточно простых случаях, а в сложных получается сложнее и запутаннее, чем написать то же самое на перле.

Teak ★★★★★
()
Ответ на: комментарий от sdio

Прокатил твой вариант: find /mmc/mmca1/MyPhoto -name '*.jpg' -printf "mv %p %h/%TY.%Tm.%Td_%TH%TM%TS_%f\n" | sh имена файлов нормальные всегда (moto_001.jpg) как сделать чтобы в MyPhoto И Photo (еще каталоге) сразу "искал" и переименовывал файл не добавляя старое имя файла (т.е. только дату) спасибо

anonymous
()
Ответ на: комментарий от Teak

ОК, убедил.

Я в след. раз просто укажу условия, при которых скрипт гарантированно работает.

sdio ★★★★★
()
Ответ на: комментарий от sdio

Ну и лучше всё-таки mv -i. :) Хоть топикстартер и сам попросил убирать оригинальное имя, но как известно юзера надо по возможности уберечь от негативных последствий выполнения его желаний. :)

Teak ★★★★★
()
Ответ на: комментарий от sdio

ок работает, только добавил 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, как ее из поиска исключить?, в ней не надо переименовавать

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.