Как переименовать файл, сохраняя такт имени файла в такте - PullRequest
1 голос
/ 12 июня 2019

Я пытаюсь переименовать несколько файлов, используя цикл for и команду mv.

FROM:

ATEST1.012345
AZEST2.098765
AZEST3.120565

TO:

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

Результаты: ATEST1.12345_0619, AZEST2.098765_0619, AZEST3.120565_0619.

Яне уверен, как сохранить число посередине, изменить только буквы и добавить дату _MMYY.

Ответы [ 4 ]

1 голос
/ 12 июня 2019

Я бы попробовал что-то вроде

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 для какого-либо пробного прогона

0 голосов
/ 12 июня 2019

Использование tr:

for f in $DIR/ATEST1.??????
do
    mv "$f" $(tr '[[:upper:]]' '[[:lower:]]' <<< "$f")_$(date +%m%y)
done
0 голосов
/ 12 июня 2019
Команда

rename позволяет выполнять массовое переименование файлов.

rename  'y/A-Z/a-z/; s/(.*)$/$1_0619/' A*
  • Первое (y / AZ / az /) выражение заменяет прописные буквы строчными
  • Второе выражение () добавляет _0619 к именам файлов

Вы можете использовать флаг -n execute в режиме пробного запуска.

0 голосов
/ 12 июня 2019

С GNU sed вы можете переключаться с верхнего на нижний регистр с помощью \L:

DIR=$1
for f in $DIR/ATEST1.??????; do
  mv $f $(sed "s/.*/\L&_$(date +%m%y)/" <<< "$f")
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...