创建以文件修改时间命名的目录

创建以文件修改时间命名的目录

我想根据文件的修改时间创建目录名称。例如,如果文件创建或修改时间是 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/shshebang 行替换为 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将、barprefix和替换suffix为实际/所需的文件名。
  • 使用 var 周围的引号来避免有趣的字符。

相关内容