Переименовать все файлы в каталоге (попорядку)
Модераторы: /dev/random, Модераторы разделов
-
Stauffenberg
- Сообщения: 2041
- Статус: ☮ PEACE ☮
- ОС: открытая и свободная
Переименовать все файлы в каталоге
Всем привет
Подскажите скрипт переименовывающий попорядку все файлы в каталоге.
К примеру, до:
123.jpg
bbb.jpg
qwerty.jpg
после:
1.jpg
2.jpg
3.jpg
Т.е. 1.jpg это бывший 123.jpg, 2.jpg - bbb.jpg, а 3.jpg это qwerty.jpg соответственно.
Заранее спасибо.
Подскажите скрипт переименовывающий попорядку все файлы в каталоге.
К примеру, до:
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)
"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: Переименовать все файлы в каталоге
Если вы считаете, что вас незаслуженно обидели, вернитесь и заслужите!
-
Kopilov
- Сообщения: 958
- ОС: [K]Ubuntu, Debian
Re: Переименовать все файлы в каталоге
Если все расширения одинаковые -- можно так:
export i=1; for f in *; do mv "$f" ${i}.jpg; export i=`expr $i + 1`; done
export i=1; for f in *; do mv "$f" ${i}.jpg; export i=`expr $i + 1`; done
-
LupoAlberto
- Сообщения: 55
- ОС: ArchLinux
Re: Переименовать все файлы в каталоге
Код: Выделить всё
perl -e '/(.*)\.jpg$/ and rename "$1.jpg", sprintf "%03d.jpg", ++$i for <*.jpg>'Взято здесь.
Если вы считаете, что вас незаслуженно обидели, вернитесь и заслужите!
-
Stauffenberg
- Сообщения: 2041
- Статус: ☮ PEACE ☮
- ОС: открытая и свободная
Re: Переименовать все файлы в каталоге
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)
"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: Переименовать все файлы в каталоге
Ну тогда надо вот так:Stauffenberg писал(а): ↑30.12.2010 23:52Вот только если я добавлю, скажем, 00101.jpg и снова запущу скрипт (второй раз), то потеряю некоторые файлы...
Код: Выделить всё
a=0; for i in *.jpg; do mv -i "$i" $(printf '%0.3d' $a).jpg; ((a++)); doneUNIX 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.
The more you believe you don't do mistakes, the more bugs are in your code.
-
Kopilov
- Сообщения: 958
- ОС: [K]Ubuntu, Debian
Re: Переименовать все файлы в каталоге
Вариант, сохраняющий оригинальные расширения:
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), исправил.
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: Переименовать все файлы в каталоге
Работает до второго раза. К примеру, после первого запуска получили 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)
"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: Переименовать все файлы в каталоге
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)
"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: Переименовать все файлы в каталоге
Значит, for f in *; do mv "$f" ~${f}; done необходим. Порядок файлов, правда, теряется.
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: Переименовать все файлы в каталоге
Код: Выделить всё
#!/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 - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
ZyX
- Сообщения: 355
- ОС: Gentoo
Re: Переименовать все файлы в каталоге
~/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: Переименовать все файлы в каталоге
Может быть, не очень красиво, сложно и длинно, зато работает =)
Код:
#! /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: Переименовать все файлы в каталоге
Я смотрю, чуть ли не у каждого есть свой скрипт на все случаи жизни 
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Переименовать все файлы в каталоге
подскажите, о знатоки, как выглядят заужения файлов?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
ZyX
- Сообщения: 355
- ОС: Gentoo
-
/dev/random
- Администратор
- Сообщения: 5495
- ОС: Gentoo
-
CCRko60
- Сообщения: 25
- ОС: Gentoo
Re: Переименовать все файлы в каталоге
Аналогично. Написал после того, как тему прочитал, ибо ни разу у самого нужды в таком скрипте не возникало
Желание - тысяча возможностей.
Нежелание - тысяча причин.
Нежелание - тысяча причин.
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: Переименовать все файлы в каталоге
Правильно. Нет такого слова. Есть понятие суффикса имени файла, да и то оно как-то не очень. По-хорошему, MIME-типами надо пользоваться, мало ли как кому-нибудь взбредет в голову файл обозвать...
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Переименовать все файлы в каталоге
чистая логика. раз у файла есть «расширение», значит, его может и не быть. верно?
как называется процесс, в результате которого файл лишится «расширения»?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
Kopilov
- Сообщения: 958
- ОС: [K]Ubuntu, Debian
Re: Переименовать все файлы в каталоге
Верно! Но отсутствие расширения -- это ещё не сужение
Расширение (или суффикс) имени, а не файла, согласен. Конечно, его может и не быть, возможность определения типа через MIME безусловно полезна. Но ведь с расширением удобнее, не так ли? Особенно когда просматриваешь список файлов в консоли
Вариант из поста 3 переименует a.jpg, b.png и c.tif в 1.jpg, 2.jpg и 3.jpg, что пользователю вряд ли понравится.
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: Переименовать все файлы в каталоге
А какая разница, какой будет суффикс? Все равно просмотрщик изображений определяет тип этого самого изображения по MIME, а никак не по суффиксу.
ИМХО, для пользователя намного удобнее было бы делать суффиксы, скажем .image - для всех картинок, .cinema - для всех фильмов и т.п. Получается и наглядно, и намного удобнее, чем куча .jpg, .png, .tiff, .gif...
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
watashiwa_daredeska
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Переименовать все файлы в каталоге
Не верно. На FAT (который не vfat, а ms-dos'овский) расширения не может не быть — оно есть всегда, но может быть пустым.
А откуда берется MIME? :) На самом деле, он определяет тип по всяким эвристикам, подобно libmagic.
Мои розовые очки
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: Переименовать все файлы в каталоге
Первые два байта файла же. Ну, иногда и эвристика нужна...
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Переименовать все файлы в каталоге
Kopilov
watashiwa_darede...
вы от меня что-то скрываете. что такое процесс расширения я, спасибо вам, кажется, понял. но вдруг мне понравится процесс заужения? как мне заузить файл?
watashiwa_darede...
вы от меня что-то скрываете. что такое процесс расширения я, спасибо вам, кажется, понял. но вдруг мне понравится процесс заужения? как мне заузить файл?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
watashiwa_daredeska
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Переименовать все файлы в каталоге
Скопировать с досовской фат на, скажем, ext3 — в ней нет расширений :)
Ну, далеко не всегда два, и тем более первые :)
Мои розовые очки
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Переименовать все файлы в каталоге
ага, я знал! какое-то десятое чувство всё время мне это подсказывало!watashiwa_daredeska писал(а): ↑02.01.2011 01:23Скопировать с досовской фат на, скажем, ext3 — в ней нет расширений
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог