2013-05-29 100 views
1

我的需求是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

[java]標記的原因是什麼? – aartist

回答

1

這應該可以工作,但如果你的文件名中有空格,它會中斷。

ls -ltr | tail -n 1 | awk '{ print $NF }' 

由於@EricJablow在評論中所述,您可以通過通-l選項,並跳過awk乾脆。

ls -tr | tail -n 1 
+0

這顯示目錄內的所有文件名。我只想要最新的一個。 – R11G

+0

沒有。 |尾巴-1作品 – R11G

+0

謝謝!你還可以簡要地告訴'{print $ NF}'' – R11G

0

您是在遠程計算機上運行Java程序,還是在本地運行並試圖從中調用ssh?如果你想讓本地程序以某種方式調用ssh在遠程機器上運行命令,請查看JCraft的jSch庫。這是一個example by Ayberk Cansever。您可以使用其他人給出的UNIX管道而不是示例中的命令。

如果你正在調用ssh並試圖在遠程機器上運行一個Java文件,我猜測這個賦值的目的不是從你的Java程序調用一個shell,而是使用Java的功能7 Files對象或其早期Java版本中的前任對象。看看Files.readAttributes()Files.walkFileTree()Files.getLastModifiedTime()。這看起來不太可能,因爲在這種情況下Java沒有購買任何東西。

+0

我從遠程機器上運行。 也就像你在其中一個答案中提出的那樣,我認爲'ls -tr | tail -n 1'給出了用權限,用戶組,時間戳等東西創建的最新文件。由於我只需要文件名(沒有文件名與它們有空格),所以我覺得'ls -ltr |尾巴-n 1 | awk'{print $ NF}''完全適合。 – R11G

+0

帶'-t'選項的'ls'給出了最後修改時間順序,'-r'反轉了這個順序。如果你是從一個終端運行,你可能已經爲'ls'創建了一個別名來添加默認選項:'alias ls =「ls -F」'例如爲文件類型添加標記。爲了避免這種情況,可以使用'/ bin/ls -tr |尾巴-n 1'。 –

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 

結果被轉換時,通過排序時間和返回最新的元件。

相關問題