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

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

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

winhex
Сообщения: 223
ОС: Debian

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

Сообщение winhex »

Есть каталог содержащий несколько тысяч файлов. Некоторые из них содержать определенную последовательность символов (к примеру, qwerty) нужно переименовать такие файлы и каталоги, заменив эту последовательность на символ подчеркивания.
Для этого насколько я понимаю подойдет find и ее функция exec, помогите написать такую команду...
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Помогите переименовать файлы по определенному критерию.

Сообщение eddy »

Что-то вроде

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

find . -name "*qwerty*" -print0 | xargs -0 rename "qwerty" "_"
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Помогите переименовать файлы по определенному критерию.

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

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

Re: Помогите переименовать файлы по определенному критерию.

Сообщение watashiwa_daredeska »

sash-kan писал(а):
30.09.2010 22:38
или просто
$ rename 's/qwerty/_/' /тот/самый/каталог/*
winhex писал(а):
30.09.2010 16:51
Есть каталог содержащий несколько тысяч файлов.
Для нескольких тысяч может обломаться по длине ком. строки.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Помогите переименовать файлы по определенному критерию.

Сообщение drBatty »

sash-kan писал(а):
30.09.2010 22:38
или просто

$ prename
bash: prename: command not found
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

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

Re: Помогите переименовать файлы по определенному критерию.

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

drBatty писал(а):
30.09.2010 23:23
sash-kan писал(а):
30.09.2010 22:38
или просто

$ prename
bash: prename: command not found

Существуют 2 разные утилиты с именем rename. Поэтому в некоторых дистрибутивах одну из них переименовали в prename. В большинстве же просто доступна только какая-нибудь одна из них. Какая - угадать сложно.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Помогите переименовать файлы по определенному критерию.

Сообщение eddy »

Но все равно, если файлов слишком много, без find с xargs вряд ли обойтись.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Помогите переименовать файлы по определенному критерию.

Сообщение drBatty »

/dev/random писал(а):
30.09.2010 23:48
Существуют 2 разные утилиты с именем rename. Поэтому в некоторых дистрибутивах одну из них переименовали в prename. В большинстве же просто доступна только какая-нибудь одна из них. Какая - угадать сложно.

В Slackware 13 простая, которая с 3я параметрами
rename from to file...
:(
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Помогите переименовать файлы по определенному критерию.

Сообщение eddy »

drBatty писал(а):
01.10.2010 02:01
В Slackware 13 простая, которая с 3я параметрами

В мандриве и дженте тоже. Но от слишком большой длины набора аргументов это не спасает.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Помогите переименовать файлы по определенному критерию.

Сообщение drBatty »

eddy писал(а):
01.10.2010 02:17
В мандриве и дженте тоже. Но от слишком большой длины набора аргументов это не спасает.

дык у меня ВООБЩЕ не заработает так. даже с 1 файлом.

PS: можно и так:

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

find . -name "*qwerty*" | sed -r 's~(.*)qwerty(.*)~mv \x27&\x27 \x27\1_\2\x27~e'

это если в именах нет прямых кавычек и переводов строк. за то не нужно непонятной rename (:
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Помогите переименовать файлы по определенному критерию.

Сообщение SLEDopit »

drBatty писал(а):
01.10.2010 08:00
переводов строк.
неужели даже такие встречаются?
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.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Помогите переименовать файлы по определенному критерию.

Сообщение drBatty »

SLEDopit писал(а):
01.10.2010 08:24
неужели даже такие встречаются?

угу. любые кроме \0 и /
ноль - конец имени, а слеш - между каталогами. остальные байты можно...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Помогите переименовать файлы по определенному критерию.

Сообщение ZyX »

eddy писал(а):
01.10.2010 01:51
Но все равно, если файлов слишком много, без find с xargs вряд ли обойтись.

zsh наше всё!:

zsh

(zyx:~) % autoload zmv (zyx:~) % zmv -W '**/*qwerty*' '**/*_*'

Спасибо сказали:
winhex
Сообщения: 223
ОС: Debian

Re: Помогите переименовать файлы по определенному критерию.

Сообщение winhex »

Спасибо откликнувшимся, но возникли проблемы.

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

find . -name "*qwerty*" -print0 | xargs -0 rename "qwerty" "_"

в ответ получил это:

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

xargs: rename: exited with status 255; aborting


("sash-kan") писал(а):или просто
$ prename 's/qwerty/_/' /тот/самый/каталог/*

Эта команда сработала, но были заменены только те последовательности, перед которыми стоял пробел. Там где последовательность была частью имени например exampleqwerty или 1qwertyexample все осталось без изменений.

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

find . -name "*qwerty*" | sed -r 's~(.*)qwerty(.*)~mv \x27&\x27 \x27\1_\2\x27~e'

в ответ:

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

sh: Syntax error: word unexpected

sh: Syntax error: word unexpected

sh: Syntax error: word unexpected

sh: Syntax error: word unexpected

sh: Syntax error: word unexpected

sh: Syntax error: word unexpected


и еще, нужно чтобы команда рекурсивно прошлась по каталогам, т.к. не все файлы содержат эту ерунду, а лишь некоторые....
("ZyX") писал(а):zsh наше всё!:

согласен, но нет возможности поставить zsh


Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Помогите переименовать файлы по определенному критерию.

Сообщение drBatty »

winhex писал(а):
01.10.2010 14:00
в ответ:

я проверил, мой однострок работает.

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

find . -name "*qwerty*" | sed -r 's~(.*)qwerty(.*)~mv \x27&\x27 \x27\1_\2\x27~e'

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

doc@bx:~/test$ bash --version
GNU bash, version 3.1.17(2)-release (i486-slackware-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
doc@bx:~/test$ sed --version
GNU sed версия 4.2
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
winhex
Сообщения: 223
ОС: Debian

Re: Помогите переименовать файлы по определенному критерию.

Сообщение winhex »

drBatty писал(а):
01.10.2010 14:14
winhex писал(а):
01.10.2010 14:00
в ответ:

я проверил, мой однострок работает.

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

find . -name "*qwerty*" | sed -r 's~(.*)qwerty(.*)~mv \x27&\x27 \x27\1_\2\x27~e'

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

doc@bx:~/test$ bash --version
GNU bash, version 3.1.17(2)-release (i486-slackware-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
doc@bx:~/test$ sed --version
GNU sed версия 4.2



Даже не знаю, почему у меня нет:

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

bash --version
GNU bash, version 4.0.33(1)-release (x86_64-pc-linux-gnu)


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

sed --version
GNU sed version 4.2.1


попробовал еще раз, та же ошибка...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Помогите переименовать файлы по определенному критерию.

Сообщение drBatty »

winhex писал(а):
01.10.2010 15:09
Даже не знаю, почему у меня нет:

если у вас локаль UTF-8, то возможно в именах неправильные символы. Попробуйте перед командой написать

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

LC_ALL=C find ...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Помогите переименовать файлы по определенному критерию.

Сообщение ZyX »

А если писать на bash?:

~/tmp/bash/test-rename.sh (Created by format.vim)

Rename() { for file in "$1"/* ; do newfile="${file//$2/$3}" if [ "a$newfile" != "a$file" ] ; then mv "$file" "$newfile" fi if [ -d "$newfile" ] ; then Rename "$newfile" "$2" "$3" fi done } Rename . qwerty _

Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Помогите переименовать файлы по определенному критерию.

Сообщение bormant »

winhex писал(а):
01.10.2010 14:00
find . -name "*qwerty*" -print0 | xargs -0 rename "qwerty" "_"

А так:

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

find . -name "*qwerty*" -print0 | xargs -0 -n 1 rename qwerty _


Кормить rename можно по одному (-n 1) или другому разумному количеству имен за раз, а не всеми сразу, иначе, с чем боролись (длинная строка ввода), от того и умираем.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Помогите переименовать файлы по определенному критерию.

Сообщение ZyX »

bormant писал(а):
01.10.2010 18:50
winhex писал(а):
01.10.2010 14:00
find . -name "*qwerty*" -print0 | xargs -0 rename "qwerty" "_"

А так:

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

find . -name "*qwerty*" -print0 | xargs -0 -n 1 rename qwerty _


Кормить rename можно по одному (-n 1) или другому разумному количеству имен за раз, а не всеми сразу, иначе, с чем боролись (длинная строка ввода), от того и умираем.

xargs умеет запускать команду, не превышая максимальную длину строки ввода и без всяких -n. Вы легко можете в этом убедиться, запустив

(Created by format.vim)

find / -iname \* -print0 | xargs -0 echo


Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Помогите переименовать файлы по определенному критерию.

Сообщение drBatty »

bormant писал(а):
01.10.2010 18:50
Кормить rename можно по одному (-n 1) или другому разумному количеству имен за раз, а не всеми сразу, иначе, с чем боролись (длинная строка ввода), от того и умираем.

в мане написано, что xargs сама определяет, сколько имён можно скормить, и кормит максимальными порциями.
-n1 ведёт к резкому снижению быстродействия, ибо вызов одной команды bash с N аргументами, намного(в разы) дешевле вызова N команд.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
linnewbie
Сообщения: 31
ОС: Debian Squeeze

Re: Помогите переименовать файлы по определенному критерию.

Сообщение linnewbie »

На форуме как-то была подсказка - пакет mmv: mmv "*qwerty*" "#1_#2"
Спасибо сказали:
winhex
Сообщения: 223
ОС: Debian

Re: Помогите переименовать файлы по определенному критерию.

Сообщение winhex »

ZyX, скрипт работает, спасибо. Но возникли проблемы с местами вида: &qwerty
Причем с & проблемы возникли у всех предложенных методов. Как можно переименовать и такие файлы, которые содержат последовательность &qwerty?
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Помогите переименовать файлы по определенному критерию.

Сообщение ZyX »

winhex писал(а):
04.10.2010 16:11
ZyX, скрипт работает, спасибо. Но возникли проблемы с местами вида: &qwerty
Причем с & проблемы возникли у всех предложенных методов. Как можно переименовать и такие файлы, которые содержат последовательность &qwerty?

Какого рода проблемы? У меня никаких проблем. Может быть, вы скопировали скрипт до того, как я поместил $1 в строке for file in "$1"/* ; do в двойные штрихи (когда я только написал сообщение там этих штрихов не было)?
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Помогите переименовать файлы по определенному критерию.

Сообщение ZyX »

Ещё добавьте штрихи вокруг правой части присваивания значения переменной newfile (см. сообщение со скриптом, там я это исправил).
Спасибо сказали:
winhex
Сообщения: 223
ОС: Debian

Re: Помогите переименовать файлы по определенному критерию.

Сообщение winhex »

Какого рода проблемы? У меня никаких проблем.

Почему-то если есть этот злосчастный амперсанд выкидывает такую ошибку:

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

No correct mountpoint specified.
Спасибо сказали:
winhex
Сообщения: 223
ОС: Debian

Re: Помогите переименовать файлы по определенному критерию.

Сообщение winhex »

Решил проблему так:

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

Rename . "&qwerty" _
Спасибо сказали:
winhex
Сообщения: 223
ОС: Debian

Re: Помогите переименовать файлы по определенному критерию.

Сообщение winhex »

Подскажите, как при переименовании find экранировать спец. символы, пробелы?
ZyX, или возможно в ваш скрипт можно добавить возможность переименования только файлов или только каталогов?

Почему не работает такая команда:

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

find . -type d -name "* *" -print0 | xargs -0 rename " " _

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

Re: Помогите переименовать файлы по определенному критерию.

Сообщение ZyX »

winhex писал(а):
11.10.2010 17:00
Подскажите, как при переименовании find экранировать спец. символы, пробелы?

Не имею ни малейшего понятия: с возможностями zsh find становится ненужен.

winhex писал(а):
11.10.2010 17:00
ZyX, или возможно в ваш скрипт можно добавить возможность переименования только файлов или только каталогов?

Для переименования только каталогов:

~/tmp/bash/test-rename.sh (Created by format.vim)

Rename() { for fname in "$1"/* ; do newfname="${fname//$2/$3}" if [ -d "$fname" ] && [ "a$newfname" != "a$fname" ] ; then mv "$fname" "$newfname" fname="$newfname" fi if [ -d "$fname" ] ; then Rename "$fname" "$2" "$3" fi done } Rename . qwerty _


Для переименования только файлов добавьте ! перед первым -d.

winhex писал(а):
11.10.2010 17:00
Почему не работает такая команда:

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

find . -type d -name "* *" -print0 | xargs -0 rename " " _

Что пишет? У меня всё работает.
Спасибо сказали:
winhex
Сообщения: 223
ОС: Debian

Re: Помогите переименовать файлы по определенному критерию.

Сообщение winhex »

Что пишет? У меня всё работает.

На команду

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

find . -type d -name "* *" -print0 | xargs -0 rename " " _

не пишет ничего. Но и ничего не делает. Т.е. имена каталогов с пробелами остаются такими же, как были.
пытаюсь этой же командой произвести замену точки на запятую так:

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

find . -type d -name "* *" -print0 | xargs -0 rename "." ,

получаю в ответ:

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

syntax error at (eval 1) line 1, near "."
xargs: rename: завершен со статусом 255; прерываюсь

Вашим скриптом это кст. тоже не получилось сделать:

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

mv: cannot move `./145' to `,/145': No such file or directory


При этом ваш скрипт замечательно работает. Проблема возникла только с точками. Пробовал делать так:

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

Rename . "." ,

и другими способами экранировать, но что-то не выходит с точкой :(
Спасибо сказали: