我无法执行一个命令,该命令会给我另一个目录中的最新文件。
例子:
ls -tr | tail -n 1 /prj/somedir/anotherdir/closerdir/targetdir
其中有一个文件列表targetdir
,我需要从列表中分离出最新的文件。
当我输入命令时,问题是我正在对目录使用 tail 命令。
示例 2:
ls -tr | tail -n 1
tail
如果我尝试从我正在工作的目录中获取最新文件,则使用该命令有效,但如果我尝试使用绝对路径从另一个目录使用,则无效。
关于如何完成这项任务有什么建议吗?
答案1
您没有指定 shell,因此我建议您使用扎什:
ls /path/to/*(.om[1])
下面是一个包含五个文件的示例,这些文件都是在同一分钟内创建的(文件名形式为HHMMSS.txt
):
> ls tmp/378142
total 0
drwxr-xr-x 7 johnsyweb staff 238 14 Jan 08:23 ./
drwx------ 24 johnsyweb staff 816 14 Jan 08:20 ../
-rw-r--r-- 1 johnsyweb staff 0 14 Jan 08:22 082237.txt
-rw-r--r-- 1 johnsyweb staff 0 14 Jan 08:22 082238.txt
-rw-r--r-- 1 johnsyweb staff 0 14 Jan 08:22 082239.txt
-rw-r--r-- 1 johnsyweb staff 0 14 Jan 08:22 082240.txt
-rw-r--r-- 1 johnsyweb staff 0 14 Jan 08:22 082241.txt
使用echo
:
> echo tmp/378142/*(.om[1])
tmp/378142/082241.txt
使用ls
:
> ls -laF tmp/378142/*(.om[1])
-rw-r--r-- 1 johnsyweb staff 0 14 Jan 08:22 tmp/378142/082241.txt
解释:
这使用了 Zsh 的文件名扩展。
星号扩展为目录中的所有项目:
> echo tmp/378142/*
tmp/378142/082237.txt tmp/378142/082238.txt tmp/378142/082239.txt tmp/378142/082240.txt tmp/378142/082241.txt
用 修饰它.
表示所有常规文件(无目录或符号链接)。这称为通配符标志:
> echo tmp/378142/*(.)
tmp/378142/082237.txt tmp/378142/082238.txt tmp/378142/082239.txt tmp/378142/082240.txt tmp/378142/082241.txt
o
指定排序顺序,on
按名称排序:
> echo tmp/378142/*(.on)
tmp/378142/082237.txt tmp/378142/082238.txt tmp/378142/082239.txt tmp/378142/082240.txt tmp/378142/082241.txt
om
按修改时间排序(Om
)将反转顺序:
> echo tmp/378142/*(.om)
tmp/378142/082241.txt tmp/378142/082240.txt tmp/378142/082239.txt tmp/378142/082238.txt tmp/378142/082237.txt
[1]
选择列表中的第一个项目:
> echo tmp/378142/*(.om[1])
tmp/378142/082241.txt
答案2
我不清楚你想要什么。如果你想要目录中最新文件的名称
ls -t /prj/somedir/anotherdir/closerdir/targetdir | head -n 1
答案3
find /your/path -type f -exec ls -l \{\} \;
应该给你一个良好的开端(只有文件列出详细ls
输出。不只是对输出进行排序并打印必要的行。
答案4
答案很简单 - 您需要在命令后立即输入相关目录的路径ls -t
,否则ls
会认为您指的是当前目录。然后head
会读取管道输出ls
并回显顶行。因此,会产生混淆。然后只需正确执行即可:
$ ls -t /prj/somedir/anotherdir/closerdir/targetdir | head -n 1