Переименовать все файлы в каталоге (попорядку)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Переименовать все файлы в каталоге

Сообщение Stauffenberg »

Всем привет

Подскажите скрипт переименовывающий попорядку все файлы в каталоге.

К примеру, до:
123.jpg
bbb.jpg
qwerty.jpg

после:
1.jpg
2.jpg
3.jpg

Т.е. 1.jpg это бывший 123.jpg, 2.jpg - bbb.jpg, а 3.jpg это qwerty.jpg соответственно.

Заранее спасибо.
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
LupoAlberto
Сообщения: 55
ОС: ArchLinux

Re: Переименовать все файлы в каталоге

Сообщение LupoAlberto »

А если вместо скрипта — rename
P.S. «Извините, погорячился» © Что-то не получается пока :(
Если вы считаете, что вас незаслуженно обидели, вернитесь и заслужите!
Спасибо сказали:
Kopilov
Сообщения: 958
ОС: [K]Ubuntu, Debian

Re: Переименовать все файлы в каталоге

Сообщение Kopilov »

Если все расширения одинаковые -- можно так:
export i=1; for f in *; do mv "$f" ${i}.jpg; export i=`expr $i + 1`; done
Спасибо сказали:
Аватара пользователя
LupoAlberto
Сообщения: 55
ОС: ArchLinux

Re: Переименовать все файлы в каталоге

Сообщение LupoAlberto »

Код: Выделить всё

perl -e '/(.*)\.jpg$/ and rename "$1.jpg", sprintf "%03d.jpg", ++$i for <*.jpg>'

Взято здесь.
Если вы считаете, что вас незаслуженно обидели, вернитесь и заслужите!
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Переименовать все файлы в каталоге

Сообщение Stauffenberg »

LupoAlberto писал(а):
30.12.2010 23:18

Код: Выделить всё

perl -e '/(.*)\.jpg$/ and rename "$1.jpg", sprintf "%03d.jpg", ++$i for <*.jpg>'

Взято здесь.


Хорошо!
Вот только если я добавлю, скажем, 00101.jpg и снова запущу скрипт (второй раз), то потеряю некоторые файлы...
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Переименовать все файлы в каталоге

Сообщение SLEDopit »

Stauffenberg писал(а):
30.12.2010 23:52
Вот только если я добавлю, скажем, 00101.jpg и снова запущу скрипт (второй раз), то потеряю некоторые файлы...
Ну тогда надо вот так:

Код: Выделить всё

a=0; for i in *.jpg; do mv -i "$i" $(printf '%0.3d' $a).jpg; ((a++)); done
тогда никакие файлы не затрете, если все время n будете отвечать (:
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Kopilov
Сообщения: 958
ОС: [K]Ubuntu, Debian

Re: Переименовать все файлы в каталоге

Сообщение Kopilov »

Вариант, сохраняющий оригинальные расширения:
export i=1; for f in *; do mv "$f" ${i}.${f##*.}; export i=`expr $i + 1`; done
Ну и, чтобы ничего не терять, добавить перед ним
for f in *; do mv "$f" ~${f}; done
PS. В предыдущем посте была опечатка (export $i), исправил.
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Переименовать все файлы в каталоге

Сообщение Stauffenberg »

Kopilov писал(а):
30.12.2010 23:12
Если все расширения одинаковые -- можно так:
export i=1; for f in *; do mv "$f" ${i}.jpg; export i=`expr $i + 1`; done



Работает до второго раза. К примеру, после первого запуска получили 1.jpg, 2.jpg, 3.jpg. Потом я создал 11.jpg, снова запустил скрипт и получил в итоге лишь 4.jpg и все.
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Переименовать все файлы в каталоге

Сообщение Stauffenberg »

Kopilov писал(а):
31.12.2010 00:01
Вариант, сохраняющий оригинальные расширения:
export i=1; for f in *; do mv "$f" ${i}.${f##*.}; export i=`expr $i + 1`; done
Ну и, чтобы ничего не терять, добавить перед ним
for f in *; do mv "$f" ~${f}; done
PS. В предыдущем посте была опечатка (export $i), исправил.


Да, используя эту связку, все ок. Спасибо!

Если у кого есть еще предложения, не стесняйтесь, выкладывайте код ;)
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Kopilov
Сообщения: 958
ОС: [K]Ubuntu, Debian

Re: Переименовать все файлы в каталоге

Сообщение Kopilov »

Значит, for f in *; do mv "$f" ~${f}; done необходим. Порядок файлов, правда, теряется.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Переименовать все файлы в каталоге

Сообщение eddy »

Код: Выделить всё

#!/bin/sh
# this script wrote by Eddy
#
#        batchrename - renames files like 01.ext, 02.ext ...
#
# Создан 17-го Июля 2003 года в 20:35
#
#   format :  batchrename <list of files>
#        or:              -r <extension> <<list of files> or <dir>>
#   -r - recoursively
counter=0
extrec=""
if [ "$#" -lt "1" ]; then
    echo -e "\n\t\tUsage:\n\tbatchrename [opt]\nopt:"
    echo -e "-r <ext> <folder> (or file list) -- renames recoursively ALL files"
    echo -e "\tin folder <folder> (or by file list given)  with extension .<ext>"
    echo -e "<folder> -- renames ALL files in folder given"
    echo -e "<file list> -- renames ALL files of given filelist.\n\n"
    exit 0
fi
Name="$*"
if [ "$1" = "-r" ]; then
    extrec="$2"
    shift
    shift
    Name="$*"
    [ "$Name" = "" ] && Name="./"
fi
echo -e "\n\t\t\tRENAMING"

for file in $Name
do
file=`echo "$file" | sed "s/<>/ /g"`
    if [ -d "$file" ];then
    echo -e "\nDiving into \033[38m $file \033[39m"
    cd "$file"
    if [ "$extrec" != "" ]; then
        batchrename -r $extrec `ls -1 | sed "s/\ /<>/g"`
    else
        batchrename `ls -1 | sed "s/\ /<>/g"`
    fi
    cd ../
    continue
    fi
    ext=`ext "$file"`
    if [ "$ext" = "ion" ]; then
    continue
    fi
    if [ "$extrec" = "" -o "$ext" = "$extrec" ];then
        counter=`expr $counter + 1`
    echo -e "Progress: $counter files\r\c"
        mv "$file" "rnmd$counter.$ext"
    fi
done
echo -e "\n\n\t\t\tENDING"
digits=`echo $counter|awk '{print length ($0)}'`
cnt=1
while [ $digits -gt $cnt ]
do
    f=`ls -S -1|grep "rnmd[0-9]\{$cnt\}\."`
    rename rnmd rnmd0 $f
    cnt=`expr $cnt + 1`
done
if [ "$counter" -gt "0" ]; then
    rename rnmd "" rnmd*
fi
echo -e "\n\t\t\tDone !!!\n"
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Переименовать все файлы в каталоге

Сообщение ZyX »

~/tmp/perl/test-rename.pl (Created by format.vim)

#!/usr/bin/perl use strict; use warnings; local $_; my @renames=(); my $curname=1; my $newname; foreach (<*>) { my $ext = $1 if(/^.*(\..*)/); $ext="" unless defined $ext; $newname="$curname$ext"; push @renames, $_ => $newname; $curname++; } while(($_, $newname)=splice(@renames, 0, 2)) { next if($newname eq $_); if(-e $newname) { unshift @renames, $_ => "~$newname"; push @renames, "~$newname" => $newname; } else { rename $_ => $newname; } }


Спасибо сказали:
Аватара пользователя
CCRko60
Сообщения: 25
ОС: Gentoo

Re: Переименовать все файлы в каталоге

Сообщение CCRko60 »

Может быть, не очень красиво, сложно и длинно, зато работает =)

Код:

#! /bin/bash ## by CCR-60 ## Скрипт переименовывает все файлы в каталоге по порядку в файлы с именами ## 1, 2, 3 и тд. Расширение остается таким же, как у начальных файлов. ## В качестве параметра -e скрипту нужно указать расширение файлов, ## которые нужно переименовать. Например: bash script.sh -e jpg while [[ $@ ]] ; do case "$1" in "-e") shift RASSHIRENIE="$1" ;; esac shift done if [[ $RASSHIRENIE > 0 ]] then mkdir /tmp/rename-scripts ls | grep .$RASSHIRENIE > /tmp/rename-scripts/name grep -n .$RASSHIRENIE /tmp/rename-scripts/name > /tmp/rename-scripts/name_grep tail -n 1 /tmp/rename-scripts/name_grep > /tmp/rename-scripts/name_tail KOL_VO_FILES=`head -c 1 /tmp/rename-scripts/name_tail` while [[ $KOL_VO_FILES > 0 ]] do ALT_NAME=`head -n 1 /tmp/rename-scripts/name` NEW_NAME=`echo $KOL_VO_FILES`.rasshtmp mv "$ALT_NAME" "$NEW_NAME" ls | grep .$RASSHIRENIE > /tmp/rename-scripts/name grep -n .$RASSHIRENIE /tmp/rename-scripts/name > /tmp/rename-scripts/name_grep tail -n 1 /tmp/rename-scripts/name_grep > /tmp/rename-scripts/name_tail KOL_VO_FILES=`head -c 1 /tmp/rename-scripts/name_tail` done ls | grep .rasshtmp > /tmp/rename-scripts/name grep -n .rasshtmp /tmp/rename-scripts/name > /tmp/rename-scripts/name_grep tail -n 1 /tmp/rename-scripts/name_grep > /tmp/rename-scripts/name_tail KOL_VO_FILES=`head -c 1 /tmp/rename-scripts/name_tail` while [[ $KOL_VO_FILES > 0 ]] do ALT_NAME=`head -n 1 /tmp/rename-scripts/name` NEW_NAME=`echo $KOL_VO_FILES`.$RASSHIRENIE mv "$ALT_NAME" "$NEW_NAME" ls | grep .rasshtmp > /tmp/rename-scripts/name grep -n .rasshtmp /tmp/rename-scripts/name > /tmp/rename-scripts/name_grep tail -n 1 /tmp/rename-scripts/name_grep > /tmp/rename-scripts/name_tail KOL_VO_FILES=`head -c 1 /tmp/rename-scripts/name_tail` done rm -rf /tmp/rename-scripts else echo "Укажите скрипту расширение файлов, которые нужно переименовать, в \ качестве параметра. Например: bash script.sh -e jpg" fi exit 0
Желание - тысяча возможностей.
Нежелание - тысяча причин.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Переименовать все файлы в каталоге

Сообщение eddy »

Я смотрю, чуть ли не у каждого есть свой скрипт на все случаи жизни :)
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Переименовать все файлы в каталоге

Сообщение sash-kan »

подскажите, о знатоки, как выглядят заужения файлов?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Переименовать все файлы в каталоге

Сообщение ZyX »

eddy писал(а):
31.12.2010 13:31
Я смотрю, чуть ли не у каждого есть свой скрипт на все случаи жизни :)

Да нет, я его за десять минут написал.


sash-kan писал(а):
31.12.2010 17:25
подскажите, о знатоки, как выглядят заужения файлов?

Что?!
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5495
ОС: Gentoo

Re: Переименовать все файлы в каталоге

Сообщение /dev/random »

ZyX писал(а):
01.01.2011 02:51
sash-kan писал(а):
31.12.2010 17:25
подскажите, о знатоки, как выглядят заужения файлов?

Что?!

Он категорический противник термина "расширение файла".
Спасибо сказали:
Аватара пользователя
CCRko60
Сообщения: 25
ОС: Gentoo

Re: Переименовать все файлы в каталоге

Сообщение CCRko60 »

ZyX писал(а):
01.01.2011 02:51
eddy писал(а):
31.12.2010 13:31
Я смотрю, чуть ли не у каждого есть свой скрипт на все случаи жизни :)

Да нет, я его за десять минут написал.
Аналогично. Написал после того, как тему прочитал, ибо ни разу у самого нужды в таком скрипте не возникало
Желание - тысяча возможностей.
Нежелание - тысяча причин.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Переименовать все файлы в каталоге

Сообщение eddy »

/dev/random писал(а):
01.01.2011 02:53
Он категорический противник термина "расширение файла".

Правильно. Нет такого слова. Есть понятие суффикса имени файла, да и то оно как-то не очень. По-хорошему, MIME-типами надо пользоваться, мало ли как кому-нибудь взбредет в голову файл обозвать...
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Переименовать все файлы в каталоге

Сообщение sash-kan »

ZyX писал(а):
01.01.2011 02:51
sash-kan писал(а):
31.12.2010 17:25
подскажите, о знатоки, как выглядят заужения файлов?

Что?!
чистая логика. раз у файла есть «расширение», значит, его может и не быть. верно?
как называется процесс, в результате которого файл лишится «расширения»?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Kopilov
Сообщения: 958
ОС: [K]Ubuntu, Debian

Re: Переименовать все файлы в каталоге

Сообщение Kopilov »

sash-kan писал(а):
01.01.2011 15:50
чистая логика. раз у файла есть «расширение», значит, его может и не быть. верно?

Верно! Но отсутствие расширения -- это ещё не сужение :)
Расширение (или суффикс) имени, а не файла, согласен. Конечно, его может и не быть, возможность определения типа через MIME безусловно полезна. Но ведь с расширением удобнее, не так ли? Особенно когда просматриваешь список файлов в консоли ;)

sash-kan писал(а):
01.01.2011 15:50
как называется процесс, в результате которого файл лишится «расширения»?

Вариант из поста 3 переименует a.jpg, b.png и c.tif в 1.jpg, 2.jpg и 3.jpg, что пользователю вряд ли понравится.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Переименовать все файлы в каталоге

Сообщение eddy »

Kopilov писал(а):
01.01.2011 16:09
Вариант из поста 3 переименует a.jpg, b.png и c.tif в 1.jpg, 2.jpg и 3.jpg, что пользователю вряд ли понравится.

А какая разница, какой будет суффикс? Все равно просмотрщик изображений определяет тип этого самого изображения по MIME, а никак не по суффиксу.
ИМХО, для пользователя намного удобнее было бы делать суффиксы, скажем .image - для всех картинок, .cinema - для всех фильмов и т.п. Получается и наглядно, и намного удобнее, чем куча .jpg, .png, .tiff, .gif...
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Переименовать все файлы в каталоге

Сообщение watashiwa_daredeska »

sash-kan писал(а):
01.01.2011 15:50
раз у файла есть «расширение», значит, его может и не быть. верно?
Не верно. На FAT (который не vfat, а ms-dos'овский) расширения не может не быть — оно есть всегда, но может быть пустым.

eddy писал(а):
01.01.2011 16:20
просмотрщик изображений определяет тип этого самого изображения по MIME
А откуда берется MIME? :) На самом деле, он определяет тип по всяким эвристикам, подобно libmagic.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Переименовать все файлы в каталоге

Сообщение eddy »

watashiwa_darede... писал(а):
01.01.2011 23:48
А откуда берется MIME?

Первые два байта файла же. Ну, иногда и эвристика нужна...
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Переименовать все файлы в каталоге

Сообщение sash-kan »

Kopilov
watashiwa_darede...
вы от меня что-то скрываете. что такое процесс расширения я, спасибо вам, кажется, понял. но вдруг мне понравится процесс заужения? как мне заузить файл?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Переименовать все файлы в каталоге

Сообщение watashiwa_daredeska »

sash-kan писал(а):
02.01.2011 00:33
как мне заузить файл?
Скопировать с досовской фат на, скажем, ext3 — в ней нет расширений :)

eddy писал(а):
02.01.2011 00:20
Первые два байта файла же.
Ну, далеко не всегда два, и тем более первые :)
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Переименовать все файлы в каталоге

Сообщение sash-kan »

watashiwa_daredeska писал(а):
02.01.2011 01:23
sash-kan писал(а):
02.01.2011 00:33
как мне заузить файл?
Скопировать с досовской фат на, скажем, ext3 — в ней нет расширений :)
ага, я знал! какое-то десятое чувство всё время мне это подсказывало!
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали: