!!linux下文件名称以时间结尾的,如何在shell脚本中找到时间最新的那个文件?

happybgt 2010-02-04 10:10:11
linux下 /root目录下的三个文件名称最后的结尾部分是以时间命名的,如何在shell脚本中找到时间最新

的那个文件?
如/root下文件名称为:
slave-20100203-1357
slave-20100203-1417
slave-20100203-1710
...

谢谢
...全文
901 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
steptodream 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 steptodream 的回复:]
引用 15 楼 happybgt 的回复:
我在终端中输入ll命令则正常,在脚本中,则提示ll:command not found  ?

引用 14 楼 steptodream 的回复:
第八列你改一下就可以了啊 把语句的执行结果赋给变量 我刚才就告诉你了啊

filename=`ll -t|awk 'NR==2{print $8;exit}'`


用which ll 看看ll命令在哪儿
然后再shell里加上他的全路径
filename=`/path/ll -t|awk 'NR==2{print $8;exit}'`
[/Quote]
其实ll 是ls -l的替换
所以你换成ls就行
filename=`ls -lt|awk 'NR==2{print $8;exit}'`
steptodream 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 happybgt 的回复:]
我在终端中输入ll命令则正常,在脚本中,则提示ll:command not found  ?

引用 14 楼 steptodream 的回复:
第八列你改一下就可以了啊 把语句的执行结果赋给变量 我刚才就告诉你了啊

filename=`ll -t|awk 'NR==2{print $8;exit}'`

[/Quote]
用which ll 看看ll命令在哪儿
然后再shell里加上他的全路径
filename=`/path/ll -t|awk 'NR==2{print $8;exit}'`
happybgt 2010-02-04
  • 打赏
  • 举报
回复
我在终端中输入ll命令则正常,在脚本中,则提示ll:command not found ?

[Quote=引用 14 楼 steptodream 的回复:]
第八列你改一下就可以了啊 把语句的执行结果赋给变量 我刚才就告诉你了啊

filename=`ll -t|awk 'NR==2{print $8;exit}'`
[/Quote]
steptodream 2010-02-04
  • 打赏
  • 举报
回复
第八列你改一下就可以了啊 把语句的执行结果赋给变量 我刚才就告诉你了啊

filename=`ll -t|awk 'NR==2{print $8;exit}'`
happybgt 2010-02-04
  • 打赏
  • 举报
回复
ll -t|awk 'NR==2{print $9;exit}'

ll -t:按时间排序
awk 'NR==2{print $9;exit}':取第二行,也就是最新的,$9第九列就是文件名

ll-t之后,文件名在第8列啊,“$9第九列”应该错了
此外,我怎么把输出这个文件名,赋给一个变量,用于我对这个文件进行操作?谢谢
steptodream 2010-02-04
  • 打赏
  • 举报
回复
那是反单引号 反单引号会把这句话当命令执行
file_date=`echo ${file} | awk -F'-' '{print $2$3}'`

正句的意思是 把echo ${file} | awk -F'-' '{print $2$3}'执行的结果 赋给变量file_date
happybgt 2010-02-04
  • 打赏
  • 举报
回复
他说的那个我不是很明白,你说的方法中“file_date=`echo ${file} | awk -F'-' '{print $2$3}'`
”最外边那两个不是单引号吗?

[Quote=引用 8 楼 steptodream 的回复:]
引用 7 楼 happybgt 的回复:
如果:
slave-20100203-1357
slave-20100203-1417
slave-20100203-1710
...
master-20100203-1357
master-20100203-1417
master-20100203-1710
...
我想找出时间最新的slave-20100203-1710,那我用哪种方法呢?谢谢

要是你不单纯靠文件名来判断 你就用他说的那个
[/Quote]
happybgt 2010-02-04
  • 打赏
  • 举报
回复
他说的那个我不是很明白,你说的方法中“file_date=`echo ${file} | awk -F'-' '{print $2$3}'`
”最外边那两个不是单引号吗?

[Quote=引用 8 楼 steptodream 的回复:]
引用 7 楼 happybgt 的回复:
如果:
slave-20100203-1357
slave-20100203-1417
slave-20100203-1710
...
master-20100203-1357
master-20100203-1417
master-20100203-1710
...
我想找出时间最新的slave-20100203-1710,那我用哪种方法呢?谢谢

要是你不单纯靠文件名来判断 你就用他说的那个
[/Quote]
steptodream 2010-02-04
  • 打赏
  • 举报
回复
你先了解一下linux下关于文件时间的问题吧
在Linux中,没有文件创建时间的概念。只有文件的访问时间、修改时间、状态改变时间。也就是说不能知道文件的创建时间。但如果文件创建后就没有修改过,修改时间=创建时间;如果文件创建后,状态就没有改变过,那么状态改变时间=创建时间;如果文件创建后,没有被读取过,那么访问时间=创建时间,这个基本不太可能。
steptodream 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 happybgt 的回复:]
如果:
slave-20100203-1357
slave-20100203-1417
slave-20100203-1710
...
master-20100203-1357
master-20100203-1417
master-20100203-1710
...
我想找出时间最新的slave-20100203-1710,那我用哪种方法呢?谢谢
[/Quote]
要是你不单纯靠文件名来判断 你就用他说的那个
happybgt 2010-02-04
  • 打赏
  • 举报
回复
如果:
slave-20100203-1357
slave-20100203-1417
slave-20100203-1710
...
master-20100203-1357
master-20100203-1417
master-20100203-1710
...
我想找出时间最新的slave-20100203-1710,那我用哪种方法呢?谢谢
steptodream 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 happybgt 的回复:]
ll -t命令?应该是ls -t吧?
怎么取第二行,ls -t按时间排序后,最新的应该在第一行,应该取第一行啊?
$9第九列就是文件名 ?

引用 2 楼 lylm 的回复:
ll -t|awk 'NR==2{print $9;exit}'

ll -t:按时间排序
awk 'NR==2{print $9;exit}':取第二行,也就是最新的,$9第九列就是文件名 

[/Quote]
是ll命令 不是ls
如果你ll显示出来的时间 和文件名上的时间一样的话 他这个最简单
happybgt 2010-02-04
  • 打赏
  • 举报
回复
ll -t命令?应该是ls -t吧?
怎么取第二行,ls -t按时间排序后,最新的应该在第一行,应该取第一行啊?
$9第九列就是文件名 ?

[Quote=引用 2 楼 lylm 的回复:]
ll -t|awk 'NR==2{print $9;exit}'

ll -t:按时间排序
awk 'NR==2{print $9;exit}':取第二行,也就是最新的,$9第九列就是文件名 
[/Quote]
steptodream 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 happybgt 的回复:]
麻烦你能说的详细一点吗?
怎么截取文件名?
引用 1 楼 steptodream 的回复:
把后面的字符截下来
20100203-1357
去掉-
201002031357

然后比较一遍 哪个最大就是最新的

[/Quote]
结果屏幕输出的那个文件就是你要的

#!/bin/sh
path=/root/ //改成你的路径
filename=`ls ${path}`
tmp_date=0
for file in ${filename}
do
file_date=`echo ${file} | awk -F'-' '{print $2$3}'`
if [[ ${file_date} -gt ${tmp_date} ]];then
tmp_date=${file_date}
tmp_filename=${file}
fi
done
echo ${tmp_filename}
happybgt 2010-02-04
  • 打赏
  • 举报
回复
麻烦你能说的详细一点吗?
怎么截取文件名?
[Quote=引用 1 楼 steptodream 的回复:]
把后面的字符截下来
20100203-1357
去掉-
201002031357

然后比较一遍 哪个最大就是最新的
[/Quote]
lylm 2010-02-04
  • 打赏
  • 举报
回复
ll -t|awk 'NR==2{print $9;exit}'

ll -t:按时间排序
awk 'NR==2{print $9;exit}':取第二行,也就是最新的,$9第九列就是文件名
steptodream 2010-02-04
  • 打赏
  • 举报
回复
把后面的字符截下来
20100203-1357
去掉-
201002031357

然后比较一遍 哪个最大就是最新的
happybgt 2010-02-04
  • 打赏
  • 举报
回复
谢谢你,改成ll=‘ls -l 就好了

[Quote=引用 16 楼 steptodream 的回复:]
引用 15 楼 happybgt 的回复:
我在终端中输入ll命令则正常,在脚本中,则提示ll:command not found  ?

引用 14 楼 steptodream 的回复:
第八列你改一下就可以了啊 把语句的执行结果赋给变量 我刚才就告诉你了啊

filename=`ll -t|awk 'NR==2{print $8;exit}'`


用which ll 看看ll命令在哪儿
然后再shell里加上他的全路径
filename=`/path/ll -t|awk 'NR==2{print $8;exit}'`
[/Quote]

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧