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

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


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

четверг, 28 апреля 2016 г.

Массовое переименование файлов в bash с заменой символов в середине имени

Притомили коллеги, лепящие в именах файлов все символы, предусмотренные юникодом. Кое-кто даже умудрился (честно, я не знаю, как) сохранить файл, в имени которого несколько штук \127!

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

find -iname *\;*|while IFS='' read line; \
  do NEWNAME=`echo "$line"|sed 's/\;/\,/g'`; \
  mv "$line" "$NEWNAME"; done

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

понедельник, 23 марта 2015 г.

Перекодирование неправильных имен файлов (1251-utf8)

Разбирая доставшийся по наследству каталог старого FTP, наткнулся на файлы, имена которых были созданы в cp1251 (кодировка windows), хотя сам линуксовый сервер работает в utf8, и отображались квадратиками в mc и вопросительными знаками в консоли. Пришлось вспоминать основы...

Переименование с перекодировкой (все файлы/каталоги в текущем каталоге без рекурсии):

for a in *; do b=`ls -d "$a"|iconv -f cp1251 -t utf8`;mv "$a" "$b";done


пришлось использовать переменную b, чтобы не возиться с бэкслэшами внутри цепочки ls-iconv для экранирования вложенных кавычек.

пятница, 28 июня 2013 г.

Переименование пользователя в AD для Samba

Наткнулся и уже давно на такую граблю.

Есть пользователь domain\vasya. Но теперь надо, чтобы он стал domain\vasily - чтобы не править многочисленные списки доступа и группы.
Решение очевидно: в соответствующей оснастке или из командной строки меняем его logon name и готово! Теперь Вася логинится как vasily. Вот только после первого же логина он жалуется, что не подключились его сетевые диски, которые прекрасно подключались для имени vasya.

Выясняется, что самба видит его как-то очень странно. Вот реальный пример:

id eao\\radionova_ov
uid=10096(EAO\prog1) gid=10008(EAO\domain users) группы=10008(EAO\domain users),10056(EAO\пользователи тс 1с-упп),10098(BUILTIN\users)


Пользовательница изначально была под именем prog1, стала radionova_ov. По имени "лукап" проходит нормально, но вот ID выдает неверное имя - старое. На что, собственно, и ругается самба.

До недавнего времени мне приходилось удалять пользователя и пересоздавать его - пользователи были обычными, не входящими в какие-то важные группы и т.п. Но Радионова - "младший админ", член группы "account operators" и рулит всевозможными подсистемами, поэтому ее ACL весьма велик и переносить его на свежесозданный аккаунт, не говоря уже о проблемах с переназначением прав в файловой системе на ее рабочем месте - полная жопа.

Опытно-гуглевым подходом выяснил, что старое имя хранится в кэше winbind-a, но для этого понадобилось перелопатить пару сотен ссылок.

/var/cache/samba# ls -la
-rw-------  1 root root   73728 июня  28 12:50 netsamlogon_cache.tdb
-rw-------  1 root root  315392 июня  28 11:53 netsamlogon_cache.tdb-
-rw-------  1 root root 1462272 июня  28 12:50 winbindd_cache.tdb
-rw-------  1 root root 1462272 июня  28 11:53 winbindd_cache.tdb-


(листинг частичный, там есть и другие файлы)

Отключение кэша самого winbind-a не помогло - после переименования winbindd_cache.tdb в winbindd_cache.tdb- создался новый winbindd_cache.tdb, с содержимым идентичным "закомментированному". Вылечилось только после "закомментирования" и netsamlogon_cache.tdb:

id eao\\radionova_ov
uid=10096(EAO\radionova_ov) gid=10008(EAO\domain users) группы=10008(EAO\domain users),10013(EAO\allowed rodc password replication group),10058(EAO\пользователи тс 1с-уат),10056(EAO\пользователи тс 1с-упп),10064(EAO\сит),10059(EAO\пользователи тс асу сп),10057(EAO\пользователи тс 1с-зуп),10101(EAO\пользователи 1с-до),10098(BUILTIN\users)


Если кто-то знает более оптимальный способ, прошу в комменты.

пятница, 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