Как уже сказано в ответе на вопрос, который вы связали, mv
может добавлять суффиксы к файлам, которые в противном случае были бы перезаписаны перемещаемым файлом, с номером, чтобы дать им уникальное имя файла:
mv --backup=t <source_file> <dest_file>
Команда работает, добавляя следующий неиспользуемый цифровой суффикс к файлу, который был первым в целевом каталоге. Перемещаемый файл сохранит свое исходное имя.
Однако это добавит суффиксы вроде .~1~
, что кажется не тем, что вам нужно:
$ ls
file.pdf
file.pdf.~1~
file.pdf.~2~
Вы можете переименовать эти файлы на втором этапе, чтобы получить имена в формате, подобном file_1.pdf
вместо file.pdf.~1~
, например. вот так:
rename 's/((?:\..+)?)\.~(\d+)~$/_$2$1/' *.~*~
При этом все файлы, которые заканчиваются нежелательным суффиксом резервной копии (, сопоставляются с шаблоном оболочки*.~*~
)и позволяют инструменту rename
попытаться сопоставить регулярное выражение ((?:\..+)?)\.~(\d+)~$
в имени файла. Если это совпадает, он захватит индекс из суффикса.~1~
-как вторая группа($2
)и, необязательно, если имя файла имеет расширение перед этим суффиксом, например .pdf
, которое будет захвачено первой группой ($1
). ]. Затем он заменяет полную совпадающую часть имени файла на _$2$1
, вставляя захваченные значения вместо заполнителей.
В основном он будет переименовывать, например. file.pdf.~1~
до file_1.pdf
и something.~42~
до something_42
, но он не может определить, имеет ли файл несколько расширений, поэтому, например. archive.tar.gz.~5~
станетarchive.tar_5.gz
Вы должны беспокоиться о переходе на летнее время. Например, мой часовой пояс — Канада/Восточная, а:
$ d=$(date -d "2020-03-08 00:00:00")
$ echo $d
Sun Mar 8 00:00:00 EST 2020
$ d=$(date -d "$d + 6 hours")
$ echo $d
Sun Mar 8 07:00:00 EDT 2020
#........^^
и
$ d=$(date -d "2020-11-01 00:00:00")
$ echo $d
Sun Nov 1 00:00:00 EDT 2020
$ d=$(date -d "$d + 6 hours")
$ echo $d
Sun Nov 1 05:00:00 EST 2020
#........^^
Убедитесь, что вы указали UTC для часового пояса.
$ d=$(date -u -d "2020-11-01 00:00:00")
$ echo $d
Sun Nov 1 00:00:00 UTC 2020
$ d=$(date -u -d "$d + 6 hours")
$ echo $d
Sun Nov 1 06:00:00 UTC 2020
#........^^
Так:
fmt='%d-%m-%Y %H:%M'
d=$(date -u -d "1998-01-01 00:00:00")
for i in {1..1825}; do
# print the current date
date -u -d "$d" "+$fmt"
# add 6 hours
d=$(date -u -d "$d + 6 hours")
done
Я настоятельно рекомендую вам использовать формат даты ISO ГГГГ -мм -дд :, который является однозначным форматом даты, и он сортируется одинаково в лексическом и хронологическом порядке.
С помощью GNU date
вы можете добавлять постоянно -увеличивающееся количество часов к начальной точке
start="$(date +'%Y-%m-%d')"
for i in {0..1825}
do
date --date "$start +$((i*6)) hours" +'%d-%m-%Y %H:%M'
done
Шестичасовой интервал остается постоянным, но в моем регионе (часовой пояс Великобритании )фактическое время смещается вследствие переключения между летним и зимним временем.
24-10-2020 00:00
24-10-2020 06:00
24-10-2020 12:00
24-10-2020 18:00
25-10-2020 00:00
25-10-2020 05:00 ← Six hours on from midnight because the clock goes back one hour at 03:00
25-10-2020 11:00
25-10-2020 17:00
25-10-2020 23:00
В вашем вопросе не указано, хотите ли вы, чтобы интервалы были в полночь, 6:00, полдень и 18:00, независимо от возможного переключения между летним/зимним временем, или вы хотите, чтобы интервалы были фиксированными и составляли точные шестичасовые интервалы.
Используйте date --utc
вместо простого date
, чтобы гарантировать создание серии даты и времени, которые кажутся разделенными на шесть часов, независимо от часового пояса.