Вы не должны обрабатывать вещи как ~
, оболочка делает это для Вас. Вот почему можно передать ~/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
Возможно, Вы могли смотреть на 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
Позволить date
сделайте работу!
date +%3j
Затем для миллидневной части простой прием должен вычислить 1000 плюс число миллидней и снять продвижение 1
. Таким образом для Вашего сценария:
s=$(($(date +"%H*3600+%M*60+%S")))
t=$(($s * 5 / 432 + 1000))
date "+%Y'%3j'${t#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