关于ls管道命令的疑问:传递的是文件还是文件名字符串?
你的管道命令确实无法实现预期功能,问题出在管道的工作逻辑上
- 原命令里的
ls ASH*会输出所有以ASH开头的文件名,但管道是把这些文件名以文本形式传给后面的ls -Art,而ls命令默认根本不会读取标准输入的内容——它要么处理命令行参数,要么列当前目录,所以第二个ls -Art完全无视前面传过来的文本,直接列当前目录下的所有文件,再取最后一个,这和你要筛选ASH开头文件的需求完全不沾边。
正确的实现方式
方法一:直接给ls传匹配参数
直接把ASH*作为ls -Art的参数,让它只处理这些文件:
ls -Art ASH* | tail -n 1
解释:
ls -Art ASH*会只列出以ASH开头的文件,按修改时间反向排序(最新的文件排在最后)tail -n1取最后一行,就是最新的那个文件
方法二:用find处理更复杂场景(比如文件名含空格)
如果你的文件名可能包含空格或特殊字符,上面的方法可能出问题,用find更可靠:
find . -maxdepth 1 -name 'ASH*' -type f -printf '%T@ %p\n' | sort -n | tail -n1 | cut -d' ' -f2-
解释:
find . -maxdepth 1 -name 'ASH*' -type f:在当前目录下找所有以ASH开头的普通文件-printf '%T@ %p\n':输出文件的修改时间戳(秒级,带小数)和完整路径sort -n:按时间戳从小到大排序tail -n1:取最后一行(时间戳最大,也就是最新的文件)cut -d' ' -f2-:去掉前面的时间戳,只保留文件名
内容的提问来源于stack exchange,提问作者mercurio
相关产品推荐
相关产品推荐

