Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » Команды UNIX: поиск/замена в файлах

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Khan



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

Всего записей: 38 | Зарегистр. 28-04-2002 | Отправлено: 04:19 06-06-2002 | Исправлено: lynx, 21:32 25-08-2004
oberonSOV



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1) Подход у тебя не верен. Подумай что произойдет когда ты напишешь mv *.html *.txt Шел все файлы развернет в одну срочку а после передаст комманде mv. А это точно не то, что тебе нужно.  
Пока проще решения чем find + perlscript я еще не видел.
Перл скрипт занимается парсингом входной строчки из и собственно переименованием файла. А вызов его делается так:

Код:
 
find . -type f -and -name '*.txt' -exec /full/path/rename.pl {} \;
 

2) Это решается следеующей строчкой:

Код:
 
find . -type f -exec perl -p -i.old -e s/\/usr\/bin/\/usr\/local\/bin/ {} \;  
 

При этом оригинальный файл будет сохранен с расширениь .old

Всего записей: 356 | Зарегистр. 11-03-2002 | Отправлено: 12:27 06-06-2002
Khan



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну почему же не верен. Ведь действительно, задача, достаточно часто встречающаяся. Вопрос-то ведь не в том, что делать надо именно mv. UNIX тем и хорош, что там туева хуча всяких утилит и программулек. Должно же быть какое-то стандартное решение. Кто-то ведь уже наступал на эти грабли. Просто об этом решении я ещё по причине неопытности не знаю. Вот поэтому и спрашиваю у опытных. К стати, спасибо. А какие решения ты ещё встречал?
 
P.S. Судя по активности, вопрос этот мало кого беспокоит. Придётся, видимо по уши погрузиться в маны. Или пойду, спрошу на других форумах.

Всего записей: 38 | Зарегистр. 28-04-2002 | Отправлено: 02:11 07-06-2002
Khan



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
К стати, вот ответы с других форумов:
 
Для 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

Всего записей: 38 | Зарегистр. 28-04-2002 | Отправлено: 19:31 09-06-2002
new yorik



Lame®
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Khan

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


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

это к чему тогда?

Всего записей: 2623 | Зарегистр. 31-12-2001 | Отправлено: 19:48 09-06-2002
Khan



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как к чему? Мож оно кому нада. Мне не жалко.

Всего записей: 38 | Зарегистр. 28-04-2002 | Отправлено: 11:22 10-06-2002
new yorik



Lame®
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Khan
я о том что ты хочел не скрипт для шела, а какуюнить стандартную шаблону.

Всего записей: 2623 | Зарегистр. 31-12-2001 | Отправлено: 11:25 10-06-2002
Khan



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не, я хотел найти более-менее стандартное решение этих задачек. Так как весч нужная и частая, я предполагал, что среди 2000 с лишним команд найдётся пара-тройка и для этого, просто по своей неопытности я о них не знаю. Ан нет, оказывается, поговорил тут с разными людьми и выяснил, что каждый решает это для себя. по своему. Великий юних, а таких простых штук нету. Вот и положил, мож кто топик отслеживает, и ему оно нада.

Всего записей: 38 | Зарегистр. 28-04-2002 | Отправлено: 11:37 10-06-2002
new yorik



Lame®
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Khan
ну спасибо, в жизни все пригодится

Всего записей: 2623 | Зарегистр. 31-12-2001 | Отправлено: 11:44 10-06-2002
oberonSOV



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Khan

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

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

Всего записей: 356 | Зарегистр. 11-03-2002 | Отправлено: 19:31 11-06-2002
NesterovML

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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.

Всего записей: 387 | Зарегистр. 30-05-2002 | Отправлено: 15:36 06-12-2002
eugrus



UNIX-like Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
надоже сколько вы тогда над этим вопросом мучались
целых полгода!
 
а разве простой
 
`mv *.txt *.html`
 
неработал?
 
говорят что нет
но, ПОЧЕМУ?

----------
IT-Recht Blog

Всего записей: 5471 | Зарегистр. 17-06-2004 | Отправлено: 17:55 23-08-2004 | Исправлено: eugrus, 18:03 23-08-2004
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
eugrus

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

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

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

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

Код:
mv 1.txt 2.txt 3.txt 1.html

И что ты предлагаешь делать утилите mv?

----------
Serg

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 11:08 24-08-2004
AEvseev



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кстати, у некоторых sed'ов есть ключ "-i", что значит in-place, т.е. в том же файле без создания нового.

Всего записей: 15 | Зарегистр. 10-06-2004 | Отправлено: 17:42 24-08-2004
WatashiwaDaredeska

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

 
А просто perlscript? rename входит в стандартную поставку Perl и делает как раз то, что заказано автором топика (даже чуть больше в меру perl'овых regexp'ов).

Всего записей: 17 | Зарегистр. 24-08-2004 | Отправлено: 19:01 24-08-2004
ooptimum



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вот именно поэтому и был создан KRename...

Всего записей: 2898 | Зарегистр. 30-05-2002 | Отправлено: 19:19 24-08-2004
Demetrio

uid=0
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А мне вот тут потребовалось переименовать 150 картинок с именами типа Изображение 001.jpg
Заменил русские буквы на цифру 1
 
# for a in *.jpg; do mv "$a" ${a//Изображение /1}; done

Всего записей: 9967 | Зарегистр. 29-05-2002 | Отправлено: 23:59 16-10-2004
Rayled

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день, друзья!  
Хочу переключиться на ssl, для этого надо сделать замены http на https. Подскажите, пожалуйста, как в Putty сделать, например, массовую замену в файлах *.php в папке /var/www/html/site.ru/admin/ и всех её подпапках текста "http://" на "https://". А также "http://{$smarty.server" на "https://{$smarty.server". Второе конечно можно сделать по аналогии, но читал, что надо слеши прослешивать и "другие символы", а вот что за другие - не написано, возможно знак "$" тоже надо...  
 
Пробовал вот так:

Код:
sed -i -e 's/http:\/\//https:\/\//g' /var/www/html/site.ru/*.php

Но тут меняет только в корне папки, а в подпапках - нет. Если же убрать "*.php", то как указать, что замена нужна только в php-файлах...
 
Заранее спасибо!
 
ps Друзья, знаю, что лучше вообще убрать из кода протокол и т.д., но пока нужно так.

Всего записей: 50 | Зарегистр. 21-02-2010 | Отправлено: 12:20 07-10-2018
maxz



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот что нашел у себя:
 
example to change all .htm files to .php:
 
ls *htm | awk -F. '{print "mv "$0" "$1".php"}' | sh

Всего записей: 52 | Зарегистр. 11-12-2001 | Отправлено: 15:28 07-10-2018
Rayled

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
maxz
Так это по-моему вы переименовываете расширение с htm на php, а мне надо внутри php-файлов производить замену текста...

Всего записей: 50 | Зарегистр. 21-02-2010 | Отправлено: 16:01 07-10-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Операционные системы » UNIX » Команды UNIX: поиск/замена в файлах


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru