Я использую Lubuntu 20.04 LTS. Я хотел бы добавить метку времени к некоторым файлам wav, чтобы их можно было загрузить на веб-сайт. Я хочу, чтобы первый файл был Garden2021-05-02_04-10-00.wav, а количество следующих файлов увеличивалось на 30 секунд для каждого файла. Как мне лучше сделать это, пожалуйста?
Хотя она обычно используется с заменами вида s / pattern / replacement /
, команда rename
на основе Perl фактически может принимать любые допустимые выражения 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
, когда вас устраивают предлагаемые переименования.
Обратите внимание, что файлы будут отмечены в том порядке, в котором *
раскрывается в вашем языковом стандарте. Если вам нужен другой порядок, то, IMHO, самый простой способ - переключиться на Z-оболочку ( 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
, то вы можете сделать то же самое в других оболочках, используя внешнюю 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)"
Начните с изменения даты в формате, который можно легко увеличить на 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
.