Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Вопрос по bash  (Прочитано 1264 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн San2k

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Вопрос по bash
« : 01 Октября 2008, 15:23:58 »
Народ.
В силу своей ламерозности  :idiot2: - случайно переименовал все файлы в папке на файл.расширение.gz

Так вот теперь мне нужно удалить .gz из названия всех файлов в данной папке. Подскажите небольшой скрипт для bash кто шарит, плз

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Вопрос по bash
« Ответ #1 : 01 Октября 2008, 15:55:10 »
for i in *.gz ; do
mv $i `basename $i .gz`
done
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн San2k

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Вопрос по bash
« Ответ #2 : 01 Октября 2008, 16:03:37 »
Как все просто оказалось! СПасибо большое!  :D

Оффлайн San2k

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Вопрос по bash
« Ответ #3 : 01 Октября 2008, 16:08:05 »
а можно еще небольшую просьбу - как бы сделать, чтоб скрипт сделал такую операцию не с текущей папкой, а со всеми внутри или хотя бы чтоб я могу скзать в какой папке переименовывать :)
а то я там всю иерархию попереименовывал :))

Оффлайн dr.akulavich

  • Участник
  • *
  • Сообщений: 191
  • Вольный стрелок
    • Просмотр профиля
    • Краплёная колода
Re: Вопрос по bash
« Ответ #4 : 01 Октября 2008, 17:43:57 »
find -iname '*.gz' | while read i; do mv $i `basename $i .gz`; doneКак-то так
Краплёная колода — техноблог о linux, софте, интернетах.

Оффлайн dmay

  • Старожил
  • *
  • Сообщений: 1084
  • man google, кому сказал!
    • Просмотр профиля
Re: Вопрос по bash
« Ответ #5 : 01 Октября 2008, 21:02:30 »
последствия значительного опыта императивного программирования
find ... --exec ...
или
find ...|xargs ...
Ты попал в мою коллекцию криворуких тупых нубов!

Оффлайн ziv

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Вопрос по bash
« Ответ #6 : 02 Октября 2008, 10:48:04 »
Кстати, ни так
find . -name '*.gz' -exec mv '{}' `basename '{}' .gz`
ни так
find . -name '*.gz' | xargs -I old mv old `basename old .gz`
не работает. Почему?

Оффлайн dmay

  • Старожил
  • *
  • Сообщений: 1084
  • man google, кому сказал!
    • Просмотр профиля
Re: Вопрос по bash
« Ответ #7 : 02 Октября 2008, 10:56:34 »
первый должен ругаться на missing argument или что-то такое. после 2 минут в man'е выяснишь что в конце надо ; поставить, да не просто так, а экранированную и отделённую пробелом

И попробуй ` экарнировать
Ты попал в мою коллекцию криворуких тупых нубов!

Оффлайн ziv

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Вопрос по bash
« Ответ #8 : 02 Октября 2008, 11:36:15 »
\; я просто забыл написать.

С экранированием ` пишет:
mv: target `.gz`' is not a directory
Без экранирования:
mv: `./ipcad-3.7.3.tar.gz' and `./ipcad-3.7.3.tar.gz' are the same file

Оффлайн dmay

  • Старожил
  • *
  • Сообщений: 1084
  • man google, кому сказал!
    • Просмотр профиля
Re: Вопрос по bash
« Ответ #9 : 02 Октября 2008, 11:49:41 »
попробуй сделать find . -name '*.gz' | xargs -I old echo `basename old .gz`
посмотри что получится
Ты попал в мою коллекцию криворуких тупых нубов!

Оффлайн ziv

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Вопрос по bash
« Ответ #10 : 02 Октября 2008, 12:13:15 »
Выводит имя файла с .gz
Получается, внутри `` ни {}, ни параметр -I xargs'а не работают. Странно.

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: Вопрос по bash
« Ответ #11 : 02 Октября 2008, 13:18:42 »
Выводит имя файла с .gz
Получается, внутри `` ни {}, ни параметр -I xargs'а не работают. Странно.
почему странно? `` выполняется ДО того, как и find -exec, и xargs получит список аргументов. А уж потом find заменяет {} на имя файла. Так что все нормально, другое дело, что задачу получения имени файла без расширения надо решать как-то по-другому в этом случае

Оффлайн ziv

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Вопрос по bash
« Ответ #12 : 02 Октября 2008, 14:13:23 »
А, так `` выполняется первым? Не знал, спасибо.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Вопрос по bash
« Ответ #13 : 02 Октября 2008, 15:35:03 »
а можно еще небольшую просьбу - как бы сделать, чтоб скрипт сделал такую операцию не с текущей папкой, а со всеми внутри или хотя бы чтоб я могу скзать в какой папке переименовывать :)
а то я там всю иерархию попереименовывал :))

Что-то типа вот этого
[ untested ]
find ./ -type d -exec (cd '{}' && for i in *.gz ; do mv $i `basename $i .gz` ; done ) \;[ /untested ]
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн ziv

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Вопрос по bash
« Ответ #14 : 02 Октября 2008, 16:16:22 »
а можно еще небольшую просьбу - как бы сделать, чтоб скрипт сделал такую операцию не с текущей папкой, а со всеми внутри или хотя бы чтоб я могу скзать в какой папке переименовывать :)
а то я там всю иерархию попереименовывал :))

Что-то типа вот этого
[ untested ]
find ./ -type d -exec (cd '{}' && for i in *.gz ; do mv $i `basename $i .gz` ; done ) \;[ /untested ]

Неа, не позволяет он скобки использовать.

 

Страница сгенерирована за 0.052 секунд. Запросов: 23.