Дополнение дня / временные стоимости для обеспечения 3 длин цифры

Вы не должны обрабатывать вещи как ~, оболочка делает это для Вас. Вот почему можно передать ~/filename к любому сценарию или программа и это работают - все те программы не обрабатывают ~ самостоятельно, Ваша оболочка преобразовывает аргумент /home/username/filename и передачи, что к программе вместо этого:

$ echo ~/filename
/home/mrozekma/filename

Если Вам нужно каноническое имя файла (тот, который не включает вещи как ..), используйте realpath (спасибо Neil):

$ realpath ~/../filename
/home/filename

Что касается разделения пути к имени каталога и имени файла, использовать dirname и basename:

$ dirname /foo/bar/baz
/foo/bar

$ basename /foo/bar/baz
baz

2
29.09.2011, 18:33
2 ответа

Возможно, Вы могли смотреть на printf строка формата. Первый параметр printf должна быть строка формата, которая включает заполнителей для каждого из аргументов, которые следуют.

Можно включать %d для представления аргумента в десятичном формате со знаком, и можно снабдить префиксом d 0n для n символы нулевого дополнения.

printf "%d/%d/%d" 2011 2 3

Произведет 2011/2/3

printf "%04d/%03d/%05d" 2011 2 45

Должен произвести 2011/002/00045

4
27.01.2020, 21:55
  • 1
    Спасибо! Это действительно помогает, но моя настоящая проблема состоит в том, что я не могу только вставить дополнительные нули, так как после первых 99 значений (дни, ect), повышения стоимости третий символ на своем собственном. Мой сценарий должен заполнить значения <100 с одним нулем и значениями <10 с двумя нулями, если это имеет смысл... –  Jack Anders 29.09.2011, 18:19
  • 2
    Именно это делает printf "%03d". Эти '3' 'минимальная' ширина, и эти '0' означает заполнять нулевым символом ('0') для заполнения минимальной ширины. Посмотрите примеры, которые дал digitalsean. Заметьте, что эти "2011" не имел никаких нулей добавленными, потому что это встретило минимальную ширину. –  Arcege 29.09.2011, 19:15

Позволить date сделайте работу!

date +%3j

Затем для миллидневной части простой прием должен вычислить 1000 плюс число миллидней и снять продвижение 1. Таким образом для Вашего сценария:

s=$(($(date +"%H*3600+%M*60+%S")))
t=$(($s * 5 / 432 + 1000))
date "+%Y'%3j'${t#1}"
2
27.01.2020, 21:55
  • 1
    Для использования одной только даты, +1, но как показано, 2011-01-01 00:02 производит 2011'001'1 без дополнения нуля.... Вот настроенный вариант: t=00$(($(($(date +"%H*3600+%M*60+%S"))) * 5 / 432)); date "+%Y'%3j'${t:(-3)}" –  Peter.O 30.09.2011, 06:35
  • 2
    @fred ой, хорошее место. Я отредактировал к более портативному способу дополнить число. слова благодарности –  Gilles 'SO- stop being evil' 30.09.2011, 10:20

Теги

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