Один из способов сделать это с помощью оболочки:
for f in *; do
mv -- "$f" "${f%.key*}.key"
done
С помощью ls
, хотя вы не всегда сможете получить время, вы должны быть в состоянии получить дату (год, месяц и день месяца).
В локали C вывод даты в ls -l
должен быть либо Mmm dd HH:MM
для недавних файлов (и вы должны быть в состоянии вывести год (либо этот год, либо предыдущий) или Mmm dd YYYY
для старых файлов или файлов с временем модификации в будущем. Таким образом, вы всегда сможете получить дату (YYYY-mm-dd) из этого:
eval "$(date +'year=%Y month=%m')"
LC_ALL=C ls -dn file | awk -v y="$year" -v m="$month" '{
month = index("--JanFebMarAprMayJunJulAugSepOctNovDec", $6) / 3
day = $7
if ($8 ~ /:/)
year = y - (month > m)
else
year = $8
printf "%04d-%02d-%02d\n", year, month, day
exit}'
Теперь, если вам нужно полное время модификации с максимальной точностью, боюсь, что для этого нет стандартной команды.
Вы можете найти некоторые реализации ls
, которые имеют опции для этого (ls --full-time
в GNU ls
или -... D <формат>
с FreeBSD ls
, например)
Существует ряд различных и несовместимых реализаций команды stat
(IRIX, zsh
builtin, GNU, BSD), которые могут дать вам это.
Или вы можете использовать -printf
предикат GNU find
. Или опцию -r
GNU date
.
Не все реализации дадут вам субсекундную детализацию. Остерегайтесь часовых поясов и DST, поскольку в зависимости от выбранного формата и часового пояса, в котором вы находитесь, данный вывод может быть неоднозначным и относиться к более чем одной возможной дате.
Для симлинков вы также можете спросить себя, какое время модификации ссылки или ее цели вам нужно. Некоторые из упомянутых здесь опций будут делать то или другое по умолчанию, а некоторым из них можно приказать делать то или другое по требованию.
zsh
stat: stat -F '%Y-%m-%d %T.%N %z' +mtime file
1992-05-13 14:57:00.123368710 +0100
stat
stat -c %y file
1992-05-13 14:57:00.123368710 +0100
stat
: stat -t '%F %T %z' -f %Sm file
1992-05-13 14:57:00 +0100
stat
: stat -m file
find
: find file -prune -printf '%TF %TT %Tz\n'
1992-05-13 14:57:00.1233687100 +0100
date
: date -r file '+%F %T.%N %z'
1992-05-13 14:57:00.123368710 +0100
ls
: ls -D '[%F %T %z]' -l file
-r-xr-xr-x 2 bin bin 372298 [1992-05-13 14:57:00 +0100] file
ls
: ls --full-time -l file
-r-xr-xr-x 2 bin bin 372298 1992-05-13 14:57:00.123368710 +0100 file
ls
: ls -Z '%(mtime:time=%F %T.%N %z)s'
1992-05-13 14:57:00.123368710 +0100
AIX, которую, судя по вашему ls
синопсису, вы используете, имеет команду istat
(AIX 5. 3 man page), которая отображает даты полностью (без субсекундной детализации, и неоднозначно, если вы не заставите TZ
заменить UTC0
), хотя ее не так легко разобрать:
$ LC_ALL=C TZ=UTC0 istat file
Inode 10360 on device 10/6 File
Protection: r-xr-xr-x
Owner: 2(bin) Group: 2(bin)
Link count: 2 Length 372298 bytes
Last updated: Wed May 13 14:08:13 1992
Last modified: Wed May 13 13:57:00 1992
Last accessed: Sun Jan 31 15:49:23 1993
Также обратите внимание, что для симлинков вы получите дату цели симлинка, а не самого симлинка.
Если у вас нет доступа ни к одной из этих программ, лучшим вариантом для переносимости может быть perl
:
$ perl -MPOSIX -le 'print strftime("%Y-%m-%d %T %z", localtime((lstat(shift))[9]))' file
1992-05-13 14:57:00 +0100
Обратите внимание, что немногие системы имеют время создания для файлов (иногда называемое временем рождения), и нет стандартного API, не говоря уже о команде для запроса, так что ситуация еще хуже, чем со временем модификации.
Если у вас есть GNU ls
:
ls --time-style=long-iso -l
или
ls --time-style=+FMT -l
, где FMT следует за форматом команды дата
. В вашем случае:
ls --time-style=+%Y/%m/%d -l
Вот функция POSIX для этого:
mtime() {
touch -r "$1" /etc/fstab
diff -u /etc/fstab /dev/null | head -n 1 | cut -f 2
}
Результат:
$ mtime ~/.profile
2019-07-01 06:25:34.000000000 -0500