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

Задали мне вот такую задачку на Bash'е
b76c1a651bdbc6f38056aa124e0385d9.png

C Bash'ем вообще не дружу. Подскажите какие команды нужно использовать для решения этой задачки. И хотя бы примерный алгоритм работы. А то сам взялся, наворотил кода на 2 страницы и понял что куда-то не туда двигаюсь…

Слабонервным не смотретьПытался распарсить файл с шаблоном и результат воткнуть в команду find чтобы искались нужные файлы.

#!/bin/bash

target=$1
param=$2
file_rules=$3
param2=$4
file_log=$5
par3=$6

if [ $2 != "-r" ] ; then  #Проверяем параметр файла правил на валидность
        echo "Параметр не задан или задан не верно"
        exit
fi

if [ "$4" != "-l" -a -n "$4" ] ; then #Проверяем параметр логов на валидность
        echo "Параметр задан не верно"
        exit
fi

function parseFile {
cat $1 | while read line
do
#echo "$line"

IFS=' ' read -a array <<< "$line"
i=1
for element in "${array[@]}"
do
   # echo "$element"
    case "$i" in
        "1")
        fileName="-name ""\"$element\""
        ;;
        "2")
        replace="$element"
        ;;
        "3")
        if [ "$element" != "*" ] ; then
        userName="-user ""$element"
        else
        unset userName
        fi
        ;;
        "4")
        if [ "$element" != "*" ] ; then
        group="-group ""$element"
        else
        unset group
        fi
        ;;
        "5")
        if [ "$element" != "0" ] ; then
         size="-size ""\"$element\""
        else
        unset size
        fi
        ;;
    esac
    #items[i]="$element"
    #Some actions
    let i++
done
echo "find $2 -type f $fileName $userName $group $size -print"
find $2 -type f $fileName #$userName $group #$size -print
i=1

done
}

case "$6" in
"")
parseFile $3 $1
;;
"-c")
echo "param -c"
;;
"-ca")
echo "param -ca"
;;
*)
echo "Param is wrong"
;;
esac
  • Вопрос задан
  • 11547 просмотров
Решения вопроса 1
Spencer
@Spencer
Написал от нечего делать этот скрипт. Ссылка на Patebin.

Пример файла правил (могут быть комментарии и пробельные строки):
# jpeg -> jpg
.jpeg .jpg user group 200

foto photo * * *

'file with spaces ' 'file_non_spaces_' * * *


Пример вызова:
$ ./massmv.sh ./files/ -r ./rules.txt -l ./log.txt


В логе будет что-то вроде этого:
Перемещён:  ./files/other_3.jpeg -> ./files/other_3.jpg
Перемещён:  ./files/foto_6.jpeg -> ./files/foto_6.jpg
Перемещён:  ./files/other_2.jpeg -> ./files/other_2.jpg
Перемещён:  ./files/foto_8.jpeg -> ./files/foto_8.jpg
И т.д.


Также можете выбрать опции (mv — стандартно, cp, cp all):
$ ./massmv.sh ./files/ -r ./rules.txt -l ./log.txt -c  # cp
$ ./massmv.sh ./files/ -r ./rules.txt -l ./log.txt -ca # cp all


Будут вопросы — пишите :)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
avalak
@avalak
Всю портянку под спойлером можно смело удалять. Для этих целей есть getopts

#!/usr/bin/env bash

RULES=default.txt
TOGGLEME=false

while getopts "r:f" arg; do
  case $arg in
    r) RULES=$OPTARG ;;
    f) TOGGLEME=true ;;
    *);;
  esac
done

echo $RULES


+ find для взаимодействия с файлами.
Ответ написан
Комментировать
hell0w0rd
@hell0w0rd
Просто разработчик
вам нужно подружиться с find, grep
Если нужно искать по файлу — cat file.txt | grep регулярка
Ответ написан
Комментировать
stackoverflow.com/questions/4793892/recursively-rename-files-using-find-and-sed

Смотрите в сторону fing exec.
Find-ом ищете по регулярке, exec-ом переименовываете.

Так же find умеет искать по всем нужным вам параметрам (владелец, группа, размер..).
Ответ написан
Комментировать
shambler81
@shambler81 Куратор тега Linux
согласен, чет вы ребят намутили там find +exec все что вам нужно, там 1 строчка.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы