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


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Массовое переименование файлов средствами оболочки  (Прочитано 1486 раз)

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

Оффлайн TroubleMaker

  • Автор темы
  • Участник
  • *
  • Сообщений: 132
    • Просмотр профиля
Тема файлов с расширением .u1conflict уже поднималась. Для меня она сейчас встала "в полный рост".
Есть каталог, в нем несколько тысяч  :'( мелких файлов (коллекция упакованных midi). Изначально каждый файл назывался "что-то-там.mid.miz", дабы винамп под оффтопиком понимал, что это именно упакованный midi. После какого-то сбоя в синхронизации ПОЧТИ все эти несколько тысяч файлов получили дополнительное расширение и теперь называются "что-то-там.mid.miz.u1conflict". Почти - потому что некоторые синхронизировались нормально и сохранили свои расширения.

Вопрос: как можно быстро "отрезать" лишнее расширение, вернув имена к начальному виду?
Я гуглил по поводу массового переименования, видел в нескольких местах один и тот же скрипт (как раз из-за него я и захотел получше ознакомиться с sed и обнаружил бесполезность yelp-a в этом вопросе).

Но, может, существует какое-нибудь "более другое" решение?
...тихoнькo, чтoб нe cлышaли сoсeди, oн взял, дa и нaжaл нa кнoпку "Пуcк"
(В.C.Выcoцкий, "Пpoшлa пopa вcтуплeний и прeлюдий", 0:47)

Оффлайн dieselist

  • Активист
  • *
  • Сообщений: 525
    • Просмотр профиля
    • diesel.pp.ua
Написать скрипт.
Имя не обязательно вырезать именно седом. Если у всех одинаковое расширение, которое надо отрезать, можно воспользоваться basename
попробуй выполнить такую команду, например
basename name.mid.miz.u1conflict .u1conflict
Ubuntu, Gentoo, RHEL, AIX

Оффлайн TroubleMaker

  • Автор темы
  • Участник
  • *
  • Сообщений: 132
    • Просмотр профиля
Если у всех одинаковое расширение, которое надо отрезать, можно воспользоваться basename
Спасибо! "То, что доктор прописал".

Сделал такой цикл (расширения другие, но и "у1конфликтов" у меня много):

for AA in *.u1conflict.wav; do mv $AA `basename $AA .u1conflict.wav`;done
Получилось именно то, что надо.
...тихoнькo, чтoб нe cлышaли сoсeди, oн взял, дa и нaжaл нa кнoпку "Пуcк"
(В.C.Выcoцкий, "Пpoшлa пopa вcтуплeний и прeлюдий", 0:47)

Оффлайн dieselist

  • Активист
  • *
  • Сообщений: 525
    • Просмотр профиля
    • diesel.pp.ua
Если у всех одинаковое расширение, которое надо отрезать, можно воспользоваться basename
Спасибо! "То, что доктор прописал".

Пожалуйста. Особенно эффектно в этом случае смотрится доктор на аватарке :D
Ubuntu, Gentoo, RHEL, AIX

Оффлайн TroubleMaker

  • Автор темы
  • Участник
  • *
  • Сообщений: 132
    • Просмотр профиля
Пожалуйста. Особенно эффектно в этом случае смотрится доктор на аватарке :D
И в самом деле... Пора, наверное, её менять - это я жене помогать рожать собирался - а ляльке-то сейчас уже почти два года, аватарка устарела   ;D

Пользователь решил продолжить мысль 05 Ноября 2010, 18:32:22:
Попробовал автоматизировать процесс для обхода подкаталогов. Получилась такая вот конструкция:

$cat ./test1.sh
echo mv -T \"$1\" `dirname "$1"`/\"`basename "$1" .u1conflict`\">test2.sh
chmod 777 ./test2.sh
./test2.sh

$find -name "*.u1conflict" -exec echo .\/test1.sh \"'{}'\">>test.sh \;
$chmod 777 ./test.sh
$./test.sh
то есть, генерируются два скрипта - test.sh и test2.sh
Понимаю, что некрасиво, хотя и работает. Но по другому не получается нормально сформировать полное имя (с путём) - какая-то путаница с кавычками, если в имени файла есть пробелы.
Загнать всю навороченную mv в параметры -exec не получается. Что я не учитываю?
« Последнее редактирование: 05 Ноября 2010, 18:32:22 от TroubleMaker »
...тихoнькo, чтoб нe cлышaли сoсeди, oн взял, дa и нaжaл нa кнoпку "Пуcк"
(В.C.Выcoцкий, "Пpoшлa пopa вcтуплeний и прeлюдий", 0:47)

 

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