有人可以打破这个说法吗?
sFileName=`ls -lrt $sTmpPath/$1* | grep ^- | grep -v grep | head -1 | awk 'BEGIN { FS="/" } { print $NF }'`
这里
$sTmpPath
包含 UNIX 服务器中的任何临时路径。- 传递的第一个参数是文件名。
谢谢
高塔姆
答案1
ls -lrt
:列出其非目录参数和内容其目录参数的格式为l
ong 格式,按r
相反t
时间(修改时间)顺序(从最旧到最新)。本来应该ls -lrtd --
。$sTmpPath/$1*
: 应该是"$sTmpPath/$1"*
: 的目的是列出名称$sTmpPath
以我认为开头的文件$1
。grep ^-
。更好的是grep '^-'
因为^
在几个贝壳中很特别。保留以 开头的行-
。在 的输出中ls -l
,这是以下行常规的文件,排除任何其他类型的文件(目录、符号链接、套接字...)。如果某些文件名或符号链接目标包含换行符,它也可能会给出误报。grep -v grep
。排除包含grep
.也许写这篇文章的人正在考虑这个ps | grep -v grep
技巧。这里没有意义。head -1
。的古代形式head -n 1
:选择输入的第一行。所以最旧的匹配文件的行。BEGIN{FS = "/"}
:将 awk 字段分隔符设置为/
.你宁愿用-F/
它。{print $NF}
:打印最后一个/
分隔字段,即最后一个之后的行部分/
,即文件名。请注意,awk
可以完成grep
andhead
的工作。
因此,该脚本的目的似乎是报告$sTmpPath
名称以$1
.
可以将其简化并部分修正为:
ls -nrtd -- "$sTmpPath/$1"* | awk -F/ '/^-/ {print $NF; exit}'
这里使用-n
而不是-l
避免将 uid/gids 不必要地转换为用户名/组名。
请注意,它假设文件名或符号链接目标都不包含换行符。
有了zsh
,您只需使用oldest=($sTmpPath/$1*(.Om[1]:t))
.