Помогите переименовать файлы по определенному критерию.
Модераторы: /dev/random, Модераторы разделов
-
- Сообщения: 223
- ОС: Debian
Помогите переименовать файлы по определенному критерию.
Есть каталог содержащий несколько тысяч файлов. Некоторые из них содержать определенную последовательность символов (к примеру, qwerty) нужно переименовать такие файлы и каталоги, заменив эту последовательность на символ подчеркивания.
Для этого насколько я понимаю подойдет find и ее функция exec, помогите написать такую команду...
Для этого насколько я понимаю подойдет find и ее функция exec, помогите написать такую команду...
-
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: Помогите переименовать файлы по определенному критерию.
Что-то вроде
Код: Выделить всё
find . -name "*qwerty*" -print0 | xargs -0 rename "qwerty" "_"
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка

-
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Помогите переименовать файлы по определенному критерию.
или просто
$ prename 's/qwerty/_/' /тот/самый/каталог/*
$ prename 's/qwerty/_/' /тот/самый/каталог/*
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Помогите переименовать файлы по определенному критерию.
Для нескольких тысяч может обломаться по длине ком. строки.
Мои розовые очки
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
-
- Администратор
- Сообщения: 5405
- ОС: Gentoo
Re: Помогите переименовать файлы по определенному критерию.
Существуют 2 разные утилиты с именем rename. Поэтому в некоторых дистрибутивах одну из них переименовали в prename. В большинстве же просто доступна только какая-нибудь одна из них. Какая - угадать сложно.
-
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: Помогите переименовать файлы по определенному критерию.
Но все равно, если файлов слишком много, без find с xargs вряд ли обойтись.
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка

-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Помогите переименовать файлы по определенному критерию.
/dev/random писал(а): ↑30.09.2010 23:48Существуют 2 разные утилиты с именем rename. Поэтому в некоторых дистрибутивах одну из них переименовали в prename. В большинстве же просто доступна только какая-нибудь одна из них. Какая - угадать сложно.
В Slackware 13 простая, которая с 3я параметрами
rename from to file...
:(
-
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: Помогите переименовать файлы по определенному критерию.
В мандриве и дженте тоже. Но от слишком большой длины набора аргументов это не спасает.
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка

-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Помогите переименовать файлы по определенному критерию.
дык у меня ВООБЩЕ не заработает так. даже с 1 файлом.
PS: можно и так:
Код: Выделить всё
find . -name "*qwerty*" | sed -r 's~(.*)qwerty(.*)~mv \x27&\x27 \x27\1_\2\x27~e'
это если в именах нет прямых кавычек и переводов строк. за то не нужно непонятной rename (:
-
- Модератор
- Сообщения: 4823
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: Помогите переименовать файлы по определенному критерию.
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.
The more you believe you don't do mistakes, the more bugs are in your code.
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Помогите переименовать файлы по определенному критерию.
угу. любые кроме \0 и /
ноль - конец имени, а слеш - между каталогами. остальные байты можно...
-
- Сообщения: 355
- ОС: Gentoo
-
- Сообщения: 223
- ОС: Debian
Re: Помогите переименовать файлы по определенному критерию.
Спасибо откликнувшимся, но возникли проблемы.
в ответ получил это:
Эта команда сработала, но были заменены только те последовательности, перед которыми стоял пробел. Там где последовательность была частью имени например exampleqwerty или 1qwertyexample все осталось без изменений.
в ответ:
и еще, нужно чтобы команда рекурсивно прошлась по каталогам, т.к. не все файлы содержат эту ерунду, а лишь некоторые....
согласен, но нет возможности поставить zsh
Код: Выделить всё
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
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Помогите переименовать файлы по определенному критерию.
я проверил, мой однострок работает.
Код: Выделить всё
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
-
- Сообщения: 223
- ОС: Debian
Re: Помогите переименовать файлы по определенному критерию.
drBatty писал(а): ↑01.10.2010 14:14
я проверил, мой однострок работает.
Код: Выделить всё
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
попробовал еще раз, та же ошибка...
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Помогите переименовать файлы по определенному критерию.
если у вас локаль UTF-8, то возможно в именах неправильные символы. Попробуйте перед командой написать
Код: Выделить всё
LC_ALL=C find ...
-
- Сообщения: 355
- ОС: Gentoo
Re: Помогите переименовать файлы по определенному критерию.
А если писать на 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 _
-
- Сообщения: 1354
Re: Помогите переименовать файлы по определенному критерию.
А так:
Код: Выделить всё
find . -name "*qwerty*" -print0 | xargs -0 -n 1 rename qwerty _
Кормить rename можно по одному (-n 1) или другому разумному количеству имен за раз, а не всеми сразу, иначе, с чем боролись (длинная строка ввода), от того и умираем.
-
- Сообщения: 355
- ОС: Gentoo
Re: Помогите переименовать файлы по определенному критерию.
bormant писал(а): ↑01.10.2010 18:50
А так:
Код: Выделить всё
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
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Помогите переименовать файлы по определенному критерию.
в мане написано, что xargs сама определяет, сколько имён можно скормить, и кормит максимальными порциями.
-n1 ведёт к резкому снижению быстродействия, ибо вызов одной команды bash с N аргументами, намного(в разы) дешевле вызова N команд.
-
- Сообщения: 31
- ОС: Debian Squeeze
Re: Помогите переименовать файлы по определенному критерию.
На форуме как-то была подсказка - пакет mmv: mmv "*qwerty*" "#1_#2"
-
- Сообщения: 223
- ОС: Debian
Re: Помогите переименовать файлы по определенному критерию.
ZyX, скрипт работает, спасибо. Но возникли проблемы с местами вида: &qwerty
Причем с & проблемы возникли у всех предложенных методов. Как можно переименовать и такие файлы, которые содержат последовательность &qwerty?
Причем с & проблемы возникли у всех предложенных методов. Как можно переименовать и такие файлы, которые содержат последовательность &qwerty?
-
- Сообщения: 355
- ОС: Gentoo
Re: Помогите переименовать файлы по определенному критерию.
Какого рода проблемы? У меня никаких проблем. Может быть, вы скопировали скрипт до того, как я поместил $1 в строке for file in "$1"/* ; do в двойные штрихи (когда я только написал сообщение там этих штрихов не было)?
-
- Сообщения: 355
- ОС: Gentoo
Re: Помогите переименовать файлы по определенному критерию.
Ещё добавьте штрихи вокруг правой части присваивания значения переменной newfile (см. сообщение со скриптом, там я это исправил).
-
- Сообщения: 223
- ОС: Debian
Re: Помогите переименовать файлы по определенному критерию.
Какого рода проблемы? У меня никаких проблем.
Почему-то если есть этот злосчастный амперсанд выкидывает такую ошибку:
Код: Выделить всё
No correct mountpoint specified.
-
- Сообщения: 223
- ОС: Debian
Re: Помогите переименовать файлы по определенному критерию.
Решил проблему так:
Код: Выделить всё
Rename . "&qwerty" _
-
- Сообщения: 223
- ОС: Debian
Re: Помогите переименовать файлы по определенному критерию.
Подскажите, как при переименовании find экранировать спец. символы, пробелы?
ZyX, или возможно в ваш скрипт можно добавить возможность переименования только файлов или только каталогов?
Почему не работает такая команда:
ZyX, или возможно в ваш скрипт можно добавить возможность переименования только файлов или только каталогов?
Почему не работает такая команда:
Код: Выделить всё
find . -type d -name "* *" -print0 | xargs -0 rename " " _
-
- Сообщения: 355
- ОС: Gentoo
Re: Помогите переименовать файлы по определенному критерию.
Не имею ни малейшего понятия: с возможностями zsh find становится ненужен.
Для переименования только каталогов:
~/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 " " _
Что пишет? У меня всё работает.
Спасибо сказали:
-
- Сообщения: 223
- ОС: Debian
Re: Помогите переименовать файлы по определенному критерию.
Что пишет? У меня всё работает.
На команду
Код: Выделить всё
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 . "." ,
и другими способами экранировать, но что-то не выходит с точкой
