Advertisement
junc

Скрипт массового переименования файлов по шаблону (Bash)

Apr 29th, 2013
961
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 3.49 KB | None | 0 0
  1. #!/usr/bin/env bash
  2.  
  3. RULES=""
  4. LOG=""
  5. MODE="mv"
  6. DIR="./"
  7.  
  8. RenameFile()
  9. {
  10.     local path="$1"
  11.     local from="$2"
  12.     local to="$3"
  13.     local file=$(basename $path)
  14.     local dir=$(dirname $path)/
  15.     local new="$dir"$(echo $file | sed "s/$from/$to/")
  16.    
  17.     case "$MODE" in
  18.         mv)
  19.             echo -n "Перемещён: " >> "$log"
  20.             echo -e " $path -> $new" >> "$log"
  21.            
  22.             mv "$path" "$new"
  23.         ;;
  24.        
  25.         cp)
  26.             echo -n "Скопирован: " >> "$log"
  27.             echo -e " $path -> $new" >> "$log"
  28.            
  29.             cp "$path" "$new"
  30.             echo "$new" >> "$cptemp"
  31.         ;;
  32.        
  33.         all)
  34.             echo -n "Скопирован: " >> "$log"
  35.             echo -e " $path -> $new" >> "$log"
  36.            
  37.             cp "$path" "$new"
  38.         ;;
  39.     esac
  40. }
  41.  
  42. # если указан каталог
  43. if [[ -n "$1" && "$1" != -* && -d "$1" ]] ; then
  44.     DIR="$1"
  45.     shift
  46. fi
  47.  
  48. # разбираем параметры
  49. while getopts :r:l:ca arg ; do
  50.     case "$arg" in
  51.         r) RULES="$OPTARG" ;;
  52.         l) LOG="$OPTARG" ;;
  53.         c) MODE="cp" ;;
  54.         a) [[ "$MODE" == "cp" ]] && MODE="all" ;;
  55.         ?) echo "Не указан аргумент для '${OPTARG}'" >&2 ; exit 1;;
  56.         *) echo "Не существующий параметр '${arg}'." >&2; exit 1;;
  57.     esac
  58. done
  59.  
  60. # указан ли файл правил
  61. if [[ -z "${RULES}" || ! -r "${RULES}" ]] ; then
  62.     echo "Файл правил не указан или пуст." >&2
  63.     exit 1
  64. fi
  65.  
  66. temp=$(mktemp)
  67. log=$(mktemp)
  68.  
  69. [[ "$MODE" == "cp" ]] && cptemp=$(mktemp)
  70.  
  71. parseVars()
  72. {
  73.     # если строка пустая или закомментирована
  74.     [[ -z "$line" || "$line" == \#* ]] && continue
  75.    
  76.     # если маски файлов заданы в кавычках (example: 'name of file')
  77.     if [[ $(echo "$line" | grep -P "^\s*'([^'])*'\s*'([^'])*'") ]] ; then
  78.         FILE1=$(echo "$line" | gawk -F "'" '{print $2}')
  79.         FILE2=$(echo "$line" | gawk -F "'" '{print $4}')
  80.         local spaces=$(echo "$line" | gawk -F "'" '{print $5}')
  81.         user=$(echo "$spaces" | gawk -F ' ' '{print $1}')
  82.         group=$(echo "$spaces" | gawk -F ' ' '{print $2}')
  83.         size=$(echo "$spaces" | gawk -F ' ' '{print $3}')
  84.     else
  85.         FILE1=$(echo "$line" | gawk -F ' ' '{print $1}')
  86.         FILE2=$(echo "$line" | gawk -F ' ' '{print $2}')
  87.         user=$(echo "$line" | gawk -F ' ' '{print $3}')
  88.         group=$(echo "$line" | gawk -F ' ' '{print $4}')
  89.         size=$(echo "$line" | gawk -F ' ' '{print $5}')
  90.     fi
  91. }
  92.  
  93. cat "$RULES" | while read line ; do
  94.     # получаем значения из файла правил
  95.     parseVars
  96.    
  97.     comm=""
  98.     [[ "$user" != "*" ]] && comm="-a -user $user"
  99.     [[ "$group" != "*" ]] && comm="$comm -a -group $group"
  100.     [[ "$size" == "*" || "$size" == "0" ]] || comm="$comm -a -size -$size"
  101.    
  102.     find "$DIR" -name "*${FILE1}*" -type f $comm -exec echo {} \; 2>&- >> $temp
  103.    
  104.     cat "$temp" | while read file ; do
  105.         # если файл не доступен для чтения
  106.         [[ -z "$file" || ! -r "$file" ]] && continue
  107.         # переименовываем
  108.         RenameFile "$file" "$FILE1" "$FILE2"
  109.     done
  110.    
  111.     # перезаписываем файл
  112.     echo "" > "$temp"
  113. done
  114.  
  115. if [[ "$MODE" == "cp" ]] ; then
  116.     cat "$RULES" | while read line ; do
  117.         parseVars
  118.        
  119.         cat "$cptemp" | while read file ; do
  120.             if [[ $(echo "$file" | grep "$FILE1") && -r "$file" ]] ; then
  121.                 rm "$file"
  122.                 echo -e "Удалён временный файл: $file" >> "$log"
  123.             fi
  124.         done
  125.     done
  126. fi
  127.  
  128. # лог
  129. if [[ -n "$LOG" ]] ; then
  130.     cat "$log" > "$LOG"
  131. else
  132.     cat "$log"
  133. fi
  134.  
  135. # удаляем временные файлы
  136. rm "$temp" "$log"
  137.  
  138. if [[ "$MODE" == "cp" ]] ; then
  139.     rm "$cptemp"
  140. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement