Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env bash
- RULES=""
- LOG=""
- MODE="mv"
- DIR="./"
- RenameFile()
- {
- local path="$1"
- local from="$2"
- local to="$3"
- local file=$(basename $path)
- local dir=$(dirname $path)/
- local new="$dir"$(echo $file | sed "s/$from/$to/")
- case "$MODE" in
- mv)
- echo -n "Перемещён: " >> "$log"
- echo -e " $path -> $new" >> "$log"
- mv "$path" "$new"
- ;;
- cp)
- echo -n "Скопирован: " >> "$log"
- echo -e " $path -> $new" >> "$log"
- cp "$path" "$new"
- echo "$new" >> "$cptemp"
- ;;
- all)
- echo -n "Скопирован: " >> "$log"
- echo -e " $path -> $new" >> "$log"
- cp "$path" "$new"
- ;;
- esac
- }
- # если указан каталог
- if [[ -n "$1" && "$1" != -* && -d "$1" ]] ; then
- DIR="$1"
- shift
- fi
- # разбираем параметры
- while getopts :r:l:ca arg ; do
- case "$arg" in
- r) RULES="$OPTARG" ;;
- l) LOG="$OPTARG" ;;
- c) MODE="cp" ;;
- a) [[ "$MODE" == "cp" ]] && MODE="all" ;;
- ?) echo "Не указан аргумент для '${OPTARG}'" >&2 ; exit 1;;
- *) echo "Не существующий параметр '${arg}'." >&2; exit 1;;
- esac
- done
- # указан ли файл правил
- if [[ -z "${RULES}" || ! -r "${RULES}" ]] ; then
- echo "Файл правил не указан или пуст." >&2
- exit 1
- fi
- temp=$(mktemp)
- log=$(mktemp)
- [[ "$MODE" == "cp" ]] && cptemp=$(mktemp)
- parseVars()
- {
- # если строка пустая или закомментирована
- [[ -z "$line" || "$line" == \#* ]] && continue
- # если маски файлов заданы в кавычках (example: 'name of file')
- if [[ $(echo "$line" | grep -P "^\s*'([^'])*'\s*'([^'])*'") ]] ; then
- FILE1=$(echo "$line" | gawk -F "'" '{print $2}')
- FILE2=$(echo "$line" | gawk -F "'" '{print $4}')
- local spaces=$(echo "$line" | gawk -F "'" '{print $5}')
- user=$(echo "$spaces" | gawk -F ' ' '{print $1}')
- group=$(echo "$spaces" | gawk -F ' ' '{print $2}')
- size=$(echo "$spaces" | gawk -F ' ' '{print $3}')
- else
- FILE1=$(echo "$line" | gawk -F ' ' '{print $1}')
- FILE2=$(echo "$line" | gawk -F ' ' '{print $2}')
- user=$(echo "$line" | gawk -F ' ' '{print $3}')
- group=$(echo "$line" | gawk -F ' ' '{print $4}')
- size=$(echo "$line" | gawk -F ' ' '{print $5}')
- fi
- }
- cat "$RULES" | while read line ; do
- # получаем значения из файла правил
- parseVars
- comm=""
- [[ "$user" != "*" ]] && comm="-a -user $user"
- [[ "$group" != "*" ]] && comm="$comm -a -group $group"
- [[ "$size" == "*" || "$size" == "0" ]] || comm="$comm -a -size -$size"
- find "$DIR" -name "*${FILE1}*" -type f $comm -exec echo {} \; 2>&- >> $temp
- cat "$temp" | while read file ; do
- # если файл не доступен для чтения
- [[ -z "$file" || ! -r "$file" ]] && continue
- # переименовываем
- RenameFile "$file" "$FILE1" "$FILE2"
- done
- # перезаписываем файл
- echo "" > "$temp"
- done
- if [[ "$MODE" == "cp" ]] ; then
- cat "$RULES" | while read line ; do
- parseVars
- cat "$cptemp" | while read file ; do
- if [[ $(echo "$file" | grep "$FILE1") && -r "$file" ]] ; then
- rm "$file"
- echo -e "Удалён временный файл: $file" >> "$log"
- fi
- done
- done
- fi
- # лог
- if [[ -n "$LOG" ]] ; then
- cat "$log" > "$LOG"
- else
- cat "$log"
- fi
- # удаляем временные файлы
- rm "$temp" "$log"
- if [[ "$MODE" == "cp" ]] ; then
- rm "$cptemp"
- fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement