我想根据文件的修改时间创建目录名称。例如,如果文件创建或修改时间是 03/17/2016 18:00:00 那么我想创建一个名为1703206
.我正在使用 HP-UX。
答案1
仅使用 POSIX 工具(HP-UX 没有更多工具),这很困难,因为没有方便的方法来获取文件的修改时间。使用 时ls -l
,您需要处理两种情况:带有月、日、房屋和分钟的最近文件和带有月、日和年的旧文件(> 6 个月)。 (可能有一种更简单的方法,通过制作适当的区域设置,但我不知道是否可以在 HP-UX 上完成。)
#!/bin/sh
set -e -f
set -- $(LC_ALL=C ls -dlog -- "$1")
# $1=permissions $2=link_count $3=size $4,$5,$6=date_time $7...=filename
case $4 in
Jan) month=1;;
Feb) month=2;;
Mar) month=3;;
Apr) month=4;;
May) month=5;;
Jun) month=6;;
Jul) month=7;;
Aug) month=8;;
Sep) month=9;;
Oct) month=10;;
Nov) month=11;;
Dec) month=12;;
esac
case $6 in
*:*) # The timestamp is within the last 6 month, so
# the year is the current or previous year.
current_month=$(LC_ALL=C date +%Y%m)
year=${current_month%??}
current_month=${current_month#????}
case $current_month in 0*) current_month=${current_month#0};; esac
if [ $current_month -lt $month ]; then year=$((year-1)); fi;;
*) year=$6;;
esac
if [ $month -le 9 ]; then month=0$month; fi
day=$5
if [ $day -le 9 ]; then day=0$day; fi
mkdir $year$month$day
如果您使用的是旧版本的 HP-UX,其中/bin/sh
包含旧的 Bourne shell,则可能需要将/bin/sh
shebang 行替换为 POSIX shell(例如 ksh)的路径。
答案2
在 Linux 上,如果foo
是你的文件
stat -c %Z foo
将给出自纪元以来的第二个(请参阅man stat
,您可以使用%W
, %X
, %Y
,%Z
来表示创建时间、访问时间、修改时间、更改时间)
date --date=@$(stat -c %Z foo) +%m%d%y
会给你的格式。
所以
mkdir bar/prefix$(date --date=@$(stat -c %Z foo) +%m%d%y)suffix
foo
将、bar
、prefix
和替换suffix
为实际/所需的文件名。- 使用 var 周围的引号来避免有趣的字符。