27 ноября 2011 г.

Переименовать файлы в транслит в Ubuntu Linux

Необходимо было сегодня переименовать файлы и каталоги в транслит. Поиски готового скрипта не увенчались успехом. Почему-то ни один из найденных мною вариантов не хотел запускаться. Немного подправив найденные варианты получил работоспособный скрипт, который переводит в транслит названия файлов и каталогов, а также заменяет пробел и комбинацию «_-_» на символ подчёркивания. Ниже содержимое скрипта:

#!/bin/bash
# Перекодирует рекурсивно в текущем каталоге имена
# файлов и каталогов в транслит.
SCRIPT=`readlink -e $0`
for NAME in *
  do
    LAT="$(echo $NAME | sed y/абвгдеёзийклмнопрстуфхцы/abvgdeezijklmnoprstufxcy/)"
    LAT="$(echo $LAT | sed y/АБВГДЕЁЗИЙКЛМНОПРСТУФХЦЫ/ABVGDEEZIJKLMNOPRSTUFXCY/)"
    LAT="$(echo $LAT | sed s/ч/ch/g)"
    LAT="$(echo $LAT | sed s/Ч/CH/g)"
    LAT="$(echo $LAT | sed s/ш/sh/g)"
    LAT="$(echo $LAT | sed s/Ш/SH/g)"
    LAT="$(echo $LAT | sed s/ж/zh/g)"
    LAT="$(echo $LAT | sed s/Ж/ZH/g)"
    LAT="$(echo $LAT | sed s/щ/sh\'/g)"
    LAT="$(echo $LAT | sed s/Щ/SH\'/g)"
    LAT="$(echo $LAT | sed s/э/je/g)"
    LAT="$(echo $LAT | sed s/Э/JE/g)"
    LAT="$(echo $LAT | sed s/ю/ju/g)"
    LAT="$(echo $LAT | sed s/Ю/JU/g)"
    LAT="$(echo $LAT | sed s/я/ja/g)"
    LAT="$(echo $LAT | sed s/Я/JA/g)"
    LAT="$(echo $LAT | sed s/ъ/\`/g)"
    LAT="$(echo $LAT | sed s/Ъ/\`/g)"
    LAT="$(echo $LAT | sed s/ь/\'/g)"
    LAT="$(echo $LAT | sed s/Ь/\'/g)"
    # Заменить символ пробела на символ подчёркивания
    LAT="$(echo $LAT | sed s/\\s/_/g)"
    LAT="$(echo $LAT | sed s/_-_/-/g)"
if [[ `file -b "$NAME"` == directory ]]
  then
    mv -v "$NAME" "$LAT"
    cd "$LAT"
    bash "$SCRIPT"
    cd ..
  else
    mv -v "$NAME" "$LAT"
fi
done
Скрипт можно скачать и поместить в тот каталог, содержимое которого необходимо переименовать. Остаётся только запустить его из консоли командой ./to-translit.sh или bash to-translit.sh.

19 ноября 2011 г.

Поиск и копирование файлов, изменённых за рабочий день

Устал, да и нередко просто забывал, копировать созданные файлы за рабочий день на флешку. Либо скопируешь, но забудешь эту самую флешку на рабочем месте. Чтобы иметь всегда под рукой рабочий материал, решил автоматизировать процесс по переносу файлов на свой сервер.
Получился скрипт, который находит только файлы созданные за последние 9 часов и копирует их в один общий каталог с изменением имени.
#!/bin/sh
# Получить список файлов изменённых за текущий день
# В какой директории искать файлы
DIR=/home/dir1/dir2/
# Куда копировать
DEST=/home/sshfs/encfs/dir1/
# Текущая дата и время
DATE=$(date "+%Y-%m-%d_%H:%M")
for f in $(find ${DIR} -type f -mmin -540 -size +1)
do
# Получить только имя файла
BASE=`basename $f`
# Скопировать файл в файл с другим именем
cp $f ${DEST}${DATE}_${BASE}
done
Сохраняем скрипт под именем, например, /home/auto_copy.sh и заносим задание в cron:

55 18 * * 1-5 sh /home/auto_copy.sh
Теперь каждый день с понедельника по пятницу в 18:55 будет запускаться скрипт с заданием копировать новые файлы в каталог /home/sshfs/encfs/dir1/
PS. Скрипт проверялся на работоспособность в Ubuntu 11.10. Должен работать и в других дистрибутивах Linux.