Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


Показаны сообщения с ярлыком basename. Показать все сообщения
Показаны сообщения с ярлыком basename. Показать все сообщения

среда, 18 мая 2016 г.

bash: цикл по именам файлов с пробелами

Цикл FOR по списку в bash работает хорошо. До тех пор, пока внутри элементов списка не появляются пробелы - вместе с пробелами появляются и проблемы: каждое слово в составе элемента списка рассматривается отдельно, и если попадается файл вроде "цикл не работает", то for будет выполнен для него три раза - для "цикл", для "не" и для "работает", что не есть хорошо.

Понадобилось мне сконвертировать несколько файлов из png в jpg. И как раз наступил на упомянутые грабли (имена файлов настоящие и опечатки в слове "внутренний" нет):

$ for a in `ls -Q litb\ внтуренний\ счет*.png`; do echo "$a"; done
"litb
внтуренний
счет2.png"
"litb
внтуренний
счет.png"

суббота, 9 апреля 2011 г.

Разное убунтийское

Марк Шаттлворт - редиска! 6 апреля официально вышел GNOME 3. Разработчики устроили грандиозную попойку по этому поводу. А Canonical обещает добавить его только в 11.10. Ну ведь редиска, а?

Теперь о будничном. Как я писал сегодня ночью, наконец-то нашлась нормальная версия unmo3. Та, которая ставится из официального universe, делает непонятно что, и очень старая. Новая, с официального сайта, пашет "на ура". И снова возникла необходимость массовой обработки файлов. Придумался не самый лучший, но вполне приемлемый вариант команды с использованием всё того же basename.


 for AA in /media/PROGS/Music/MUSIC/NEWMOD/*.{mo3,MO3};  \
do unmo3 -y "$AA" "/media/PROGS/Music/MUSIC/unmo3/`basename "$AA"`.MOD" \
;done


Берем из файлопомойки на виндовом диске все mo3-файлы, независимо от регистра, в котором записано расширение, каждый обрабатываем командой unmo3 и сохраняем в другом каталоге той же файлопомойки, дописывая к полному имени файла расширение .MOD. Кавычки вокруг каждого параметра - не выпендрёж, а горькая необходимость: в именах некоторых файлов содержатся пробелы и спецсимволы, которые интерпретируются оболочкой, приводя к совершенно идиотским ошибкам.

Причем .MOD (вот одно из преимуществ нового unmo3) это не просто дописанное расширение, а и измененный формат файла, ибо программа позиционирует себя как "UNMO3 2.4 - MO3 to IT/XM/S3M/MOD/MTM decoder". Можно было декодировать и в IT/XM, но я как-то больше предпочитаю MOD, чисто из ностальгических соображений.

пятница, 5 ноября 2010 г.

Массовое переименование файлов в Linux

Полез я в убунте в папочку ~/Ubuntu\ One и обнаружил, что есть там у меня каталог с несколькими тысячами мелких файлов. После какого-то сбоя синхронизации, почти ко всем этим файлам дописалось расширение ".u1conflict". Я встал в тупик: как же вернуть имена этих файлов в исходное состояние? Вручную - так я раньше свихнусь...

Помогла команда basename. Написал вот такую простенькую команду, которая сделала за меня всю черновую работу.:


for AA in *.u1conflict; do mv $AA `basename $AA .u1conflict`;done

По порядку:

for AA in *.u1conflict; do - цикл по всем файлам с расширением u1conflict.

mv $AA - переименовывает переданный ей файл, $AA - первый параметр, исходное имя. Обратите внимание на то, что в for было просто AA, а при использовании в качестве параметра добавляется "$"!

`команда` - именно "обратные" апострофы (клавиша с тильдой, самая левая в верхнем ряду стандартной клавиатуры), сначала выполняется заключенная в них команда, а потом ее вывод становится параметром другой команды, в данном случае - вторым параметром команды mv, то есть новым именем файла.

basename $AA .u1conflict - берет переданное ей имя файла, отсекает от него, если есть, имена каталогов слева от собственно имени файла, и, если указан, то отсекает и суффикс, он же - расширение. Опять же - чтобы не возникло ошибки "файл не найден", не забываем про "доллар" перед именем переменной цикла.

;done - конец цикла

При желании эту команду можно доработать, чтобы она выполняла рекурсивный обход каталогов и тем самым полностью автоматизировать процесс. Но сейчас мне лень этим заниматься.

Много дополнительной интересной информации можно найти здесь.
Дополнительный совет: man rename