Я пытаюсь переименовать несколько файлов, используя цикл for и команду mv.
ОТ:
ATEST1.012345
AZEST2.098765
AZEST3.120565
К:
atest1.012345_0619
azest2.098765_0619
azest3.120565_0619
Вот что я пробовал:
#!/bin/bash
DIR=$1
for file in $DIR/ATEST1.??????
do
mv "$file" "${file%}_$(date +%m%y)"
done
for file in $DIR/AZEST2.??????
do
mv "$file" "${file%}_$(date +%m%y)"
done
for file in $DIR/AZEST3.??????
do
mv "$file" "${file%}_$(date +%m%y)"
done
Результаты: АТЭСТ1.12345_0619, АЗЭСТ2.098765_0619, АЗЭСТ3.120565_0619.
Я не знаю, как оставить число посередине, изменить только буквы и добавить дату _MMYY.
Я бы попробовал что-то вроде
cd "$DIR" && find . -name "ATEST*" -o -name "AZEST*" | \
while read file;
do mv "$file" "$(echo $file | tr [[:upper:]] [[:lower:]])_$(date +%m%y)";
done
Я рекомендую использовать echo
вместо mv
для пробного прогона.
С GNU sed
вы можете переключаться с верхнего регистра на нижний с помощью \L
:
DIR=$1
for f in $DIR/ATEST1.??????; do
mv $f $(sed "s/.*/\L&_$(date +%m%y)/" <<< "$f")
done
Команда переименовать позволяет выполнять массовые переименования файлов.
rename 'y/A-Z/a-z/; s/(.*)$/$1_0619/' A*
Вы можете использовать флаг -n
в пробном режиме.
Использование тр:
for f in $DIR/ATEST1.??????
do
mv "$f" $(tr '[[:upper:]]' '[[:lower:]]' <<< "$f")_$(date +%m%y)
done