Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Команды UNIX: поиск/замена в файлах

Автор: Khan
Дата сообщения: 06.06.2002 03:19
Господа гуру UNIX. Подскажите, плз., решения таких проблем:
1. Нужно переименовать несколько файлов по шаблону, например: *.txt в *.html
Чем это сделать, стандартный mv шаблоны не понимает (по крайней мере во FreeBSD, под которой работаю, как в других системах - не знаю)? Шелловый скрипт писать лень, задачка-то частая, должно быть какое-то стандартное решение.
2. Под шумок второй вопросец: надо сделать однотипное изменение в нескольких файлах, например заменить /usr/bin на /usr/local/bin. Пытался делать через sed, но эту заразу нужно учить сохранять изменение в тот же файл. Как это сделать? Иначе он всё изменённое гонит на stdout. Или мож другой путь есть?

Задачки-то каждодневные, лень ради таких семечек перерывать горы манов, изобретать велосипеды. Подскажите.
Автор: oberonSOV
Дата сообщения: 06.06.2002 11:27
1) Подход у тебя не верен. Подумай что произойдет когда ты напишешь mv *.html *.txt Шел все файлы развернет в одну срочку а после передаст комманде mv. А это точно не то, что тебе нужно.
Пока проще решения чем find + perlscript я еще не видел.
Перл скрипт занимается парсингом входной строчки из и собственно переименованием файла. А вызов его делается так:

Код:
find . -type f -and -name '*.txt' -exec /full/path/rename.pl {} \;
Автор: Khan
Дата сообщения: 07.06.2002 01:11
Ну почему же не верен. Ведь действительно, задача, достаточно часто встречающаяся. Вопрос-то ведь не в том, что делать надо именно mv. UNIX тем и хорош, что там туева хуча всяких утилит и программулек. Должно же быть какое-то стандартное решение. Кто-то ведь уже наступал на эти грабли. Просто об этом решении я ещё по причине неопытности не знаю. Вот поэтому и спрашиваю у опытных. К стати, спасибо. А какие решения ты ещё встречал?

P.S. Судя по активности, вопрос этот мало кого беспокоит. Придётся, видимо по уши погрузиться в маны. Или пойду, спрошу на других форумах.
Автор: Khan
Дата сообщения: 09.06.2002 18:31
К стати, вот ответы с других форумов:

Для Bourne-style shell:

=======

for f in *.txt; do
t=$(echo "$f" |sed 's/\.txt$/.html/')
mv "$f" "$t"
done

=======

for f in {whichever-files-you-want}; do
sed 's#/usr/bin#/usr/local/bin#g' "$f" >"/tmp/$f" && \
cat "/tmp/$f" > "$f"
done

Если нужно обрабатывать файлы во всех подкаталогах, начиная с
определённого, можно для плучения списка всех файлов для цикла for
использовать find:

for f in $(find /starting/dir -name '*.txt' -print); do
# blah-blah...
done
Автор: new yorik
Дата сообщения: 09.06.2002 18:48
Khan

Цитата:
Шелловый скрипт писать лень, задачка-то частая, должно быть какое-то стандартное решение.


Цитата:
Для Bourne-style shell:

это к чему тогда?
Автор: Khan
Дата сообщения: 10.06.2002 10:22
Как к чему? Мож оно кому нада. Мне не жалко.
Автор: new yorik
Дата сообщения: 10.06.2002 10:25
Khan
я о том что ты хочел не скрипт для шела, а какуюнить стандартную шаблону.
Автор: Khan
Дата сообщения: 10.06.2002 10:37
Не, я хотел найти более-менее стандартное решение этих задачек. Так как весч нужная и частая, я предполагал, что среди 2000 с лишним команд найдётся пара-тройка и для этого, просто по своей неопытности я о них не знаю. Ан нет, оказывается, поговорил тут с разными людьми и выяснил, что каждый решает это для себя. по своему. Великий юних, а таких простых штук нету. Вот и положил, мож кто топик отслеживает, и ему оно нада.
Автор: new yorik
Дата сообщения: 10.06.2002 10:44
Khan
ну спасибо, в жизни все пригодится
Автор: oberonSOV
Дата сообщения: 11.06.2002 18:31
Khan

Цитата:
Великий юних, а таких простых штук нету

Я писал раньше про подход к проблеме Ты попробуй опиши свой шаблон без цикла. А пока сравни как такой цикл организовать в виндах и сколько для этого способов в *NIX
Оказывается всетаки Великий

Автор: NesterovML
Дата сообщения: 06.12.2002 14:36
Khan
Ty b pereimenovl temu by, chtob ona sut' otragala. Tipa:"Pereimenovanije Files pod Unix" ili kak vobshem zahochesh, no chtob tema byla vidna srazu. Spasibo.
Автор: eugrus
Дата сообщения: 23.08.2004 16:55
надоже сколько вы тогда над этим вопросом мучались
целых полгода!

а разве простой

`mv *.txt *.html`

неработал?

говорят что нет
но, ПОЧЕМУ?
Автор: f_serg
Дата сообщения: 24.08.2004 10:08
eugrus

Цитата:
но, ПОЧЕМУ?

Пусть у тебя в каталоге файлы
1.txt
2.txt
3.txt
1.html

Цитата:
простой `mv *.txt *.html`

шелл развернет в

Код: mv 1.txt 2.txt 3.txt 1.html
Автор: AEvseev
Дата сообщения: 24.08.2004 16:42
Кстати, у некоторых sed'ов есть ключ "-i", что значит in-place, т.е. в том же файле без создания нового.
Автор: WatashiwaDaredeska
Дата сообщения: 24.08.2004 18:01

Цитата:
проще решения чем find + perlscript я еще не видел.


А просто perlscript? rename входит в стандартную поставку Perl и делает как раз то, что заказано автором топика (даже чуть больше в меру perl'овых regexp'ов).
Автор: ooptimum
Дата сообщения: 24.08.2004 18:19
Вот именно поэтому и был создан KRename...
Автор: Demetrio
Дата сообщения: 16.10.2004 22:59
А мне вот тут потребовалось переименовать 150 картинок с именами типа Изображение 001.jpg
Заменил русские буквы на цифру 1

# for a in *.jpg; do mv "$a" ${a//Изображение /1}; done

Страницы: 1

Предыдущая тема: WinXP unattended setup


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.