答案1
首先将日期更改为可以轻松增加 30 秒的格式,例如 Unix 时间戳:
timestamp=$(date -d 2021-05-02T04:10:00 +%s) # --> 1619921400
然后您可以像这样增加时间戳:
timestamp=$((timestamp+30))
要获取您喜欢的文件名,请使用date
:
date -d @$timestamp "+Garden%F_%H-%M-%S.wav"
现在循环您的文件并组合命令:
timestamp=$(date -d 2021-05-02T04:10:00 +%s)
for f in *.wav; do
echo mv "$f" "$(date -d @$timestamp "+Garden%F_%H-%M-%S.wav")"
timestamp=$((timestamp+30))
done
对输出满意后,请删除echo
。
答案2
虽然它通常与 形式的替换一起使用s/pattern/replacement/
,但基于 perl 的rename
命令实际上可以接受任何有效的 perl 表达式。例如(借用pLumo 的回答)你可以这样做:
rename -n -- '
BEGIN{use Time::Piece; our $ts = Time::Piece->new(shift)}
$_ = our $ts->strftime("Garden%F_%H-%M-%S.wav");
$ts += 30
' "$(date -d 2021-05-02T04:10:00 +%s)" *.wav
-n
一旦您对建议的重命名感到满意,请删除。
请注意,文件将按照*
您所在语言环境中的扩展顺序进行标记。如果您想要其他顺序,那么在我看来,最简单的方法是切换到 Z-shell ( zsh
),您可以在其中使用glob 限定符指定排序顺序。例如,*.wav(n)
或*.wav(.non)
对纯文本文件进行排序n以数值方式n同增加:
% ls *.wav
1.wav 10.wav 11.wav 12.wav 2.wav 3.wav 4.wav 5.wav 6.wav 7.wav 8.wav 9.wav
% rename -n -- '
BEGIN{use Time::Piece; our $ts = Time::Piece->new(shift)}
$_ = our $ts->strftime("Garden%F_%H-%M-%S.wav");
$ts += 30
' "$(date -d 2021-05-02T04:10:00 +%s)" *.wav(.non)
rename(1.wav, Garden2021-05-02_04-10-00.wav)
rename(2.wav, Garden2021-05-02_04-10-30.wav)
rename(3.wav, Garden2021-05-02_04-11-00.wav)
rename(4.wav, Garden2021-05-02_04-11-30.wav)
rename(5.wav, Garden2021-05-02_04-12-00.wav)
rename(6.wav, Garden2021-05-02_04-12-30.wav)
rename(7.wav, Garden2021-05-02_04-13-00.wav)
rename(8.wav, Garden2021-05-02_04-13-30.wav)
rename(9.wav, Garden2021-05-02_04-14-00.wav)
rename(10.wav, Garden2021-05-02_04-14-30.wav)
rename(11.wav, Garden2021-05-02_04-15-00.wav)
rename(12.wav, Garden2021-05-02_04-15-30.wav)
如果你不能使用zsh
,那么你可以在其他 shell 中使用外部命令sort
和执行相同的操作xargs
:
printf '%s\0' *.wav | sort -zn | xargs -0 rename -n -- '
BEGIN{use Time::Piece; our $ts = Time::Piece->new(shift)}
$_ = our $ts->strftime("Garden%F_%H-%M-%S.wav");
$ts += 30
' "$(date -d 2021-05-02T04:10:00 +%s)"