Для начала вам нужно получить список файлов.Для этого вы можете использовать сглаживание, например *Classes.csv
.
Затем вам нужно перебрать этот список.Если вы начинаете так, он должен распечатать все файлы:
for file in *Classes.csv; do
printf %s\\n "$file"
done
Если все выглядит правильно, вам нужно знать имя файла, который вы хотите переименовать.Здесь я буду использовать оператор %
в расширении параметра, чтобы обрезать .csv
с конца.Это задокументировано в man bash
и спецификациях оболочки POSIX как удаление наименьшего соответствующего суффикса из строки.
for file in *Classes.csv; do
file_noext=${file%.csv}
printf '%s -> %s\n' "$file" "$file_noext"
done
Это уже наполовину, теперь нам нужно добавить дату и пере-добавить суффикс .csv.Дата похожа на формат% F (2019-01-29
), но не содержит дефисов.Я бы порекомендовал использовать формат% F вместо этого, если вы можете выбирать, поскольку для случайного наблюдателя более очевидно, что это дата.Для вашего формата вам понадобится %Y%m%d
(см. man 1 date
).Я использую здесь синтаксис подстановки команд $(...)
, чтобы зафиксировать выходные данные команды date
.
today=$(date +%Y%m%d)
for file in *Classes.csv; do
file_noext=${file%.csv}
printf '%s -> %s\n' "$file" "${file_noext}_${today}.csv"
done
Если все выходные данные выглядят правильно, вы захотите сделать последнее изменение и использовать mv
вместо того, чтобы просто печатать имена файлов:
today=$(date +%Y%m%d)
for file in *Classes.csv; do
file_noext=${file%.csv}
mv -- "$file" "${file_noext}_${today}.csv"
done
И это должно быть все, что необходимо.
Ваш вопрос явно задал цикл for
, но обычно я просто использовал бы util-linux
rename
Утилита:
rename 'Classes' "Classes_$(date +%Y%m%d)" ./*Classes.csv
Обратите внимание, что эта однострочная программа не будет работать в Ubuntu Linux, так как она предоставляет несовместимую rename
утилиту.(В таких системах вам нужно будет вызвать его как rename.ul
)