Bash скрипт перевода имен файлов в нижний регистр

Самый простой способ:

for i in `ls`; do mv "$i" `echo "$i" | tr "[:upper:]" "[:lower:]"`; done

и все, но мы же не ищем легких путей, под катом небольшой скриптик:

#!/bin/bash
function process_dir()
{
  #используем локальные переменные, ибо функция рекурсивна
  local dir=$1

local item
  for item in "$dir"/*
  do
    # пустая директория/* будет расширена '*', e.g.: /какаято/папка/*
    # делаем проверку на существование:
    [[ ! -e $item ]] && return    

    # если директория, обрабатываем рекурсивно
    [[ -d $item ]] && process_dir $item  

    # теперь отделим имя файла от пути и создадим
    # эквивалент имени файла "маленькими буквами"
    local path=${item%/*}
    local name=${item##*/}
    local lcase_name=$(tr 'A-Z' 'a-z' <<< $name)

    # для облегчения работы, проверим в нижнем ли регистре имя файла
    if [[ $name != $lcase_name ]]; then
      # если файл уже в нижнем регистре, то нам надо быть аккуратнее
      if [[ -e $path/$lcase_name ]]; then
        # если это директория и существующий файл - тоже директория, используем слияние
        if [[ -d $path/$lcase_name && -d $path/$name ]]; then
          # если мы все успешно переместили, удалим оставшиеся в большом регистре файлы
          local can_delete_dir=1
          local subdir_item
          for subdir_item in "$path/$name"/*
          do
            # если директория пустая, сразу удаляем
            [[ ! -e $subdir_item ]] && break
            local subdir_name=${subdir_item##*/}
            # проверяем также дублирование файлов
            if [[ -e $path/$lcase_name/$subdir_name ]]; then
              echo "CONFLICT: Cannot move item $subdir_item to $path/$lcase_name as that destination already exists"
              # тут мы не можем удалить файлы
              can_delete_dir=0
            else
              # у нас получится переместить файлы
              echo "MERGE: $subdir_item to $path/$lcase_name/$subdir_name"
              mv "$subdir_item" "$path/$lcase_name/"
            fi
          done
          # если мы все успешно переместили, удаляем директорию
          if [[ $can_delete_dir -eq 1 ]]; then
            echo "DELETE: $path/$name having merged all its contents elsewhere"
            rm $path/$name
          fi
        else
          # если такой же файл существует, не перезаписываем, а выводим сообщение об ошибке и продолжаем
          echo "CONFLICT: Cannot rename file $path/$name to $path/$lcase_name as that file already exists"
        fi
      else
        # в этой директории нет имен файлов, удовлетворяющих нашим условиям - переименовываем
        echo "RENAME: $path/$name to $path/$lcase_name"
        mv "$path/$name" "$path/$lcase_name"
      fi
    fi
  done
}

start_dir="$1"
[[ -n $start_dir && -e $start_dir ]] || { echo "Please supply the starting directory as a parameter to the script";
exit 1; }

# обрезать все окончания с '/'
start_dir=${start_dir%/}
process_dir "$start_dir"

Использование скрипта:
разрешаем выполнение

# chmod +x regisrt.sh

запускаем указывая директорию которую конопатить

# regisrt.sh /directory

Поделись с друзьями:

Опубликовано 24.11.2011 в 07:47 · Автор komivlad · Ссылка
Рубрики: Programming, shell · Теги: , , , ,

4 комментария

Подписаться на комментарии по RSS

  1. Написал(-а) Другой Иван
    23.05.2015 в 16:17
    Ответить · Ссылка

    Все работает. Спасибо, выручил.

  2. Написал(-а) komivlad
    23.03.2013 в 13:27
    Ответить · Ссылка

    Пожалуйста!)

  3. Написал(-а) Иван
    23.03.2013 в 07:01
    Ответить · Ссылка

    Большое спасибо. Все четко и понятно

Подписаться на комментарии по RSS

Написать комментарий