Как обнулить числа клавиатуры в именах файлов в Bash?

Оба правильные, но они интерпретируются как даты с двумя разными часовыми поясами. Итак, вы сравнили яблоки и апельсины:

// local dates
new Date("Jul 8, 2005").toISOString()            // "2005-07-08T07:00:00.000Z"
new Date("2005-07-08T00:00-07:00").toISOString() // "2005-07-08T07:00:00.000Z"
// UTC dates
new Date("Jul 8, 2005 UTC").toISOString()        // "2005-07-08T00:00:00.000Z"
new Date("2005-07-08").toISOString()             // "2005-07-08T00:00:00.000Z"

Я удалил вызов Date.parse(), так как он автоматически используется для строкового аргумента. Я также сравнивал даты с использованием формата ISO8601 , чтобы вы могли визуально сравнивать даты между вашими местными датами и датами UTC. Время разговора составляет 7 часов, что является разницей в часовом поясе и почему ваши тесты показывают две разные даты.

Другим способом создания этих же локальных / UTC-дат будет:

new Date(2005, 7-1, 8)           // "2005-07-08T07:00:00.000Z"
new Date(Date.UTC(2005, 7-1, 8)) // "2005-07-08T00:00:00.000Z"

Но я по-прежнему настоятельно рекомендую Moment.js , который как простой, но мощный :

// parse string
moment("2005-07-08").format()       // "2005-07-08T00:00:00+02:00"
moment.utc("2005-07-08").format()   // "2005-07-08T00:00:00Z"
// year, month, day, etc.
moment([2005, 7-1, 8]).format()     // "2005-07-08T00:00:00+02:00"
moment.utc([2005, 7-1, 8]).format() // "2005-07-08T00:00:00Z"

46
задан codeforester 28 October 2017 в 19:16
поделиться

4 ответа

В случае, если N априорно не фиксируется:

 for f in foo[0-9]*; do mv $f `printf foo%05d ${f#foo}`; done
29
ответ дан Chris Conway 26 November 2019 в 20:12
поделиться

Чистый Bash, никакие внешние процессы кроме 'mv':

for file in foo*; do
  newnumber='00000'${file#foo}      # get number, pack with zeros
  newnumber=${newnumber:(-5)}       # the last five characters
  mv $file foo$newnumber            # rename
done
4
ответ дан Fritz G. Mehner 26 November 2019 в 20:12
поделиться

Следующее сделает это:

for ((i=1; i<=N; i++)) ; do mv foo$i `printf foo%05d $i` ; done

РЕДАКТИРОВАНИЕ: измененный на использование ((i=1...)), спасибо mweerden!

2
ответ дан codeforester 26 November 2019 в 20:12
поделиться

Вот быстрое решение, которое принимает префикс фиксированной длины (Ваше "нечто") и дополнение фиксированной длины. При необходимости в большей гибкости возможно, это, по крайней мере, будет полезной начальной точкой.

#!/bin/bash

# some test data
files="foo1
foo2
foo100
foo200
foo9999"

for f in $files; do
    prefix=`echo "$f" | cut -c 1-3`        # chars 1-3 = "foo"
    number=`echo "$f" | cut -c 4-`         # chars 4-end = the number
    printf "%s%04d\n" "$prefix" "$number"
done
0
ответ дан amrox 26 November 2019 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: