我的要求是ssh到一个linux框,然后遍历一个目录并通过Java代码获取最新文件的名称。
我被困在检索最新的文件名。这是我正在使用的
ls -ltr /abc/dir/sub_dir|tail -n 1|cut -d' ' -f 11
但这一直不起作用。 通常在目录上执行ls -ltr时,输出将类似于以下模式。
-rw-r--r-- 1 xyz users 2070 May 27 20:16 9ZVU8ZNLL.xml
-rw-r--r-- 1 xyz users 1507 May 28 02:29 VU8ZNLL.xml
-rw-r--r-- 1 xyz users 1507 May 28 13:59 U8ZNLL.xml
-rw-r--r-- 1 xyz users 944 May 28 14:46 Q9ZVU8ZNLL.xml
使用上面的实用程序有时候会得到文件名,有时我会得到日期或时间戳或空值,这会导致我的进一步处理出现问题。 获取最新文件名的最佳方法是什么。
答案 0 :(得分:1)
这应该可以工作,但如果文件名中包含空格,它将会中断。
ls -ltr | tail -n 1 | awk '{ print $NF }'
在评论中说明了 @EricJablow ,您可以绕过-l
选项并完全跳过awk
。
ls -tr | tail -n 1
答案 1 :(得分:0)
您是在远程计算机上运行Java程序,还是在本地运行并尝试从中调用ssh?如果你想要一个以某种方式调用ssh的本地程序来运行远程机器上的命令,请查看JCraft的jSch库。这是一个example by Ayberk Cansever。您可以使用其他人提供的UNIX管道而不是示例中的命令。
如果您正在调用ssh并尝试在远程计算机上运行Java文件,我猜测分配的重点不是从Java程序调用shell,而是使用Java 7的功能早期Java版本中的Files
对象或其前身。查看Files.readAttributes()
,Files.walkFileTree()
和Files.getLastModifiedTime()
。这似乎不太可能,因为在这种情况下Java不会给你买任何东西。
答案 2 :(得分:0)
我有一个类似的用例:在目录中找到与模式“foo”匹配的最新文件夹。同样的事情很容易适应找到任何文件。
尝试:
find . -mindepth 1 -maxdepth 1 -name "*" -type f -printf '%f\n' | xargs ls -d --sort=time | head -1
find "." ... directory path
-name "*" ... pattern match
-type f ... only find files, no directories
转换结果,按时间排序并返回最新元素。