Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Нужен скрипт для пакетного переименования файлов

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [*nix/Linux] >> Нужен скрипт для пакетного переименования файлов
Имя
Сообщение << Старые топики   Новые топики >>
Нужен скрипт для пакетного переименования файлов - 2008-11-04 23:52:18.270000   
The Professor

Сообщений: 179
Оценки: 0
Присоединился: 2008-01-04 03:01:42.476666
Вступление
Сайм создаёт группу по интересам для *nix-пользователей. Весьма благое начинание, но интерес "оценивается" в минимум 6 месяцев пребывания на форуме и минимум 200 сообщений (предположительно, по делу). Будем набирать "толковые" сообщения.

Проблема
Нужен bash-скрипт, который бы переименовал файлы по маске из текущей директории на дату их создания (скажем, в формате YYYY.MM.DD.hh.mm.ss) с прежним расширением. Т.е., что-то типа
$ script img*jpg
img_001.jpg -> 2008.11.05.05.46.11.jpg
img_002.jpg -> 2008.11.05.05.46.18.jpg
total: 2 files
Post #: 1
RE: Нужен скрипт для пакетного переименования файлов - 2008-11-05 01:27:08.753333   
med

Сообщений: 138
Оценки: 0
Присоединился: 2006-06-12 21:06:38
cat ../'.bashrc' | grep ls
alias ls='ls -a –lcontext'

ls *.jpg | awk '$7 ~ /2/ {print $7,$8,$9}' | sed 's/:/-/g' | sed 's/ /-/1' | awk '{print "cp",$2,$1".jpg"}' | bash

ls

-rwxr-xr-x 1 unconfined_u:object_r:user_home_t:s0 xxxxx xxxxx 0 2008-11-04 23:22 2008-11-04-23-18.jpg
-rw-rw-r– 1 unconfined_u:object_r:user_home_t:s0 xxxxx xxxxx 0 2008-11-04 23:22 2008-11-04-23-21.jpg
-rwxr-xr-x 1 unconfined_u:object_r:user_home_t:s0 xxxxx xxxxx 0 2008-11-04 23:18 file1.jpg
-rw-rw-r– 1 unconfined_u:object_r:user_home_t:s0 xxxxx xxxxx 0 2008-11-04 23:21 file2.jpg
Post #: 2
RE: Нужен скрипт для пакетного переименования файлов - 2008-11-06 03:07:08.643333   
The Professor

Сообщений: 179
Оценки: 0
Присоединился: 2008-01-04 03:01:42.476666
pipe это, конечно, хорошо, но:
1. Не у всех версий ls есть ключ –lcontext. В версии 5.97 я его нашёл, а в моей 6.9 его уже нету. Кстати, так ли он нужен?
2. У файлов, созданных в разное время, дата создания отображается по разному. Это дело известное и лечится ls -l –time-style="+%Y.%m.%d.%H.%M.%S".
3. Предложенный pipe перезапишет файлы, созданные в течение той же минуты (а в своём примере я указал именно такие файлы). Как бы научить его проверять существование файлов с общими датой и временем создания? ИМХО, нужен именно скрипт.
Post #: 3
RE: Нужен скрипт для пакетного переименования файлов - 2008-11-06 11:30:54.483333   
keys

Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
# Getname: get filename from it's "modify" date and time; Getname file # Modify: 2008-11-06 11:12:41.000000000 +0000 # to # 2008.11.06.11.12.41 Getname() { local FILE="$1"; local LINE; if [ ! -f "$FILE" ]; then return 1; fi; LINE="$(stat "$FILE" | tail -2 | head -1)"; LINE="${LINE#* }"; LINE="${LINE%%.*}"; LINE="${LINE//-/.}"; LINE="${LINE// /.}"; LINE="${LINE//:/.}"; echo "$LINE"; return 0; };
[guest@localhost tmp]$ \ &gt; Getname() { &gt; local FILE="$1"; &gt; local LINE; &gt; &gt; if [ ! -f "$FILE" ]; then &gt; return 1; &gt; fi; &gt; LINE="$(stat "$FILE" | tail -2 | head -1)"; &gt; LINE="${LINE#* }"; &gt; LINE="${LINE%%.*}"; &gt; LINE="${LINE//-/.}"; &gt; LINE="${LINE// /.}"; &gt; LINE="${LINE//:/.}"; &gt; echo "$LINE"; &gt; return 0; &gt; }; [guest@localhost tmp]$ ls 1 code downloads file.jpg music save test.c test.sh [guest@localhost tmp]$ Getname file.jpg 2008.11.06.11.49.08 [guest@localhost tmp]$ Getname test.sh 2008.11.06.12.02.55 [guest@localhost tmp]$ я чуть-чуть не понял что ты имеешь в виду под датой и временем создания файла, потому написал функцию для того что более менее похоже (время последнего изменения), пробовал время изменения inode, но она тоже реагирует на всё подряд, и любое изменение меняет размер файла (а он хранится в inode, в итоге меняется время изменения inode (т.е. выбрал самое пригодное время последнего изменения))
начал было писать скрипт, но запарился, слишком большой получился, потому посылаю лишь функцию
Post #: 4
RE: Нужен скрипт для пакетного переименования файлов - 2008-11-06 17:16:37.806666   
med

Сообщений: 138
Оценки: 0
Присоединился: 2006-06-12 21:06:38
quote:

ORIGINAL: The Professor
1. Не у всех версий ls есть ключ –lcontext.


да я его показал просто чтоб не спрашивали почему эту колонку беру, мне он нужен, на счёт других не знаю :)

quote:

ORIGINAL: The Professor
2. У файлов, созданных в разное время, дата создания отображается по разному. Это дело известное и лечится ls -l –time-style="+%Y.%m.%d.%H.%M.%S".


не понял? покажи пример плз

quote:

ORIGINAL: The Professor
3. Предложенный pipe перезапишет файлы, созданные в течение той же минуты (а в своём примере я указал именно такие файлы). Как бы научить его проверять существование файлов с общими датой и временем создания? ИМХО, нужен именно скрипт.


не обязательно, добавляешь –time-style full-iso, добавятся секунды, если конечно и секунда совпала тогда не знаю как сделать
Post #: 5
RE: Нужен скрипт для пакетного переименования файлов - 2008-11-06 17:30:28.540000   
The Professor

Сообщений: 179
Оценки: 0
Присоединился: 2008-01-04 03:01:42.476666
quote:

ORIGINAL: med

quote:

ORIGINAL: The Professor
2. У файлов, созданных в разное время, дата создания отображается по разному. Это дело известное и лечится ls -l –time-style="+%Y.%m.%d.%H.%M.%S".


не понял? покажи пример плз

$ info coreutils ls

10.1.6 Formatting file timestamps
———————————

By default, file timestamps are listed in abbreviated form. Most
locales use a timestamp like `2002-03-30 23:45'. However, the default
POSIX locale uses a date like `Mar 30 2002' for non-recent timestamps,
and a date-without-year and time like `Mar 30 23:45' for recent
timestamps.

A timestamp is considered to be "recent" if it is less than six
months old, and is not dated in the future. If a timestamp dated today
is not listed in recent form, the timestamp is in the future, which
means you probably have clock skew problems which may break programs
like `make' that rely on file timestamps.
Post #: 6
RE: Нужен скрипт для пакетного переименования файлов - 2008-11-06 18:06:28.400000   
med

Сообщений: 138
Оценки: 0
Присоединился: 2006-06-12 21:06:38
чёт я не вкурю - щаз ради интереса открыл директорию с файлами от 2006 до нонешнего - время всех отображено в одном формате однако? как он изменится то - 2006 это же явно не recent? что нужно сменить чтобы отобразился этот recent / не recent timestamp?

да кстати, там чуть ниже по поводу значений timestyle вот что написано - ‘full-iso’ List timestamps in full using ISO 8601 ………. This style is equivalent to ‘+%Y-%m-%d %H:%M:%S.%N %z’.

единственная разница между твоим стилем и full-iso это %N %z’. - наносекунда наверное поможет с совпадающими секундами - имхо проще обрезать чем набирать всё в ручную, хотя на вкус и цвет как говорится.
Post #: 7
RE: Нужен скрипт для пакетного переименования файлов - 2009-02-17 14:09:56.146666   
The Professor

Сообщений: 179
Оценки: 0
Присоединился: 2008-01-04 03:01:42.476666
Скромно предлагаю вниманию общественности полученный результат. Скрипт принимает один параметр – имя файла, которы надо переименовать. Параметр может содержать regexp, то есть позволяет переименовать файлы по маске. Во избежание перезаписи, скрипт проверяет существование целевого файла и, при необходимости дописывает несколько символов.
Пока обнаружено одно неудобство: в случае переименования по маске параметр надо брать в кавычки, иначе будет переименован только первый файл, соответствующий маске.Как бы это исправить?
Буду рад любым замечаниям и предложениям.
#!/bin/sh # check if the filename is given if [ -z "$1" ] then echo "Usage: `basename $0` file-to-rename" exit 1 fi # rename consequtively all files export rename_counter=0 for file2rename in `ls $1`; do # check if destination file exists new_filename=`ls -l --time-style="+%Y.%m.%d.%H.%M.%S" "$file2rename" | cut -d' ' -f6` if [ -e "$new_filename.jpg" ] then echo "Destination file for ${file2rename} exists. Appending extra characters" # Appending characters export i=1 while [ "$i" -lt 10000 ] do case ${#i} in 1 ) extrachar="000"$i;; 2 ) extrachar="00"$i;; 3 ) extrachar="0"$i;; 4 ) extrachar=$i;; esac # test if file exists if [ -e "$new_filename$extrachar.jpg" ] # if so then pick next extra character then i+=$1 #if not then rename and proceed to the next file else mv -v $file2rename $new_filename$extrachar'.jpg' i=10000 let rename_counter=$rename_counter + 1 fi done else # just rename and move to the next file mv -v "$file2rename" $new_filename'.jpg' let rename_counter=$rename_counter+1 fi done # reporting results if [ "$rename_counter" -eq "0" ] then echo "no files to rename" else echo "total: $rename_counter file(s)" fi
Post #: 8
Страниц:  [1]
Все форумы >> [*nix/Linux] >> Нужен скрипт для пакетного переименования файлов







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.