我想在 shell 脚本中提取文件的访问日。我尝试编写以下脚本,但它不起作用。当我回声时访问日,输出是“staff”。
file=$1
accessday=$(ls -lu $file | cut -d ' ' -f 6)
答案1
答案2
如果你看一下 的典型输出ls -lu
,
-rw-r--r-- 1 someuser somegroup 74 Mar 29 05:21 filename
您会注意到组名称前面总共有五个空格字符。因此,您在命令中指定的字段 6cut
将返回组(在您的情况下为“staff”)。
另外,访问日将是字段 7,而不是符号中的 6。
一种解决方案是使用awk
,因为它会按照您默认的方式处理字段分隔符的多次出现:
accessday=$(ls -lu $file | awk '{print $7}')
答案3
根据您的问题,我将使用 stat 标准化输出,然后剪切为仅显示您想要的日期。
stat -c '%x' FILENAME | cut -c 9,10
答案4
ls
解析is的输出困难且并不总是可能。如果您想提取时间戳,有时这是必要的后备(这是唯一可移植的方法:并非所有系统都有命令stat
),但您会得到一个人类可读的时间戳,即很难转换为机器可读的。至少解决困难的部分:传递-o
和-g
选项以省略用户和组字段(这些字段在某些系统上可能包含空格,从而无法在 的输出中进行分隔ls
)。那么时间戳占据字段4-6(从1开始编号)。
access_time=$(ls -dlogu -- "$file" | awk '1 {print $4, $5, $6}')
如果你想要一个月中的某一天,你需要区分两种输出格式,是否是过去 6 个月内的时间戳。将语言环境设置为 C 以获得可靠的输出格式。在此格式中,月份中的日期始终是第二个时间戳字段。
access_day=$(ls -dlogu -- "$file" | awk '1 {print $5}')