Переименование файлов в Lunix For Loop - PullRequest
0 голосов
/ 29 января 2019
I have files like below in a directory in unix:
2007 CSE Classes.csv
2007 EEE Classes.csv
2007 ECE Classes.csv
2008 CSE Classes.csv
.
.
.
2018 ECE Classes.csv

Необходимо переименовать те, которые указаны ниже:

2007 CSE Classes_20190129.csv
2007 EEE Classes_20190129.csv
2007 ECE Classes_20190129.csv
2008 CSE Classes_20190129.csv
.
.
.
2018 ECE Classes_20190129.csv

В именах файлов также есть пробелы.

Добавленная дата будет меняться в зависимости от дня, когда скриптбежать.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Для начала вам нужно получить список файлов.Для этого вы можете использовать сглаживание, например *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)

0 голосов
/ 31 января 2019

Вы можете просто сделать это с этим, я верю,

for i in `find /path/to/yourFiles/directory -name "*.csv"` ; do mv $i ${i}_$(date +"%m-%d-%y").csv ; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...