2016-12-05 74 views
1

當前目錄中有10000個文件。它們由3部分命名,第一部分是一封信。第二個是日期。第三是一些隨機字母。我需要找到最新的文件。如果找到具有相同最新日期的多個人。我需要按字母排序的最後一個文件。如何只使用一行linux命令來查找文件?

example:files 

d20161112lif43 
x20161205flb8 
c20161201lgir334 
i20161205gid 

與所需的文件是x201612054lb8

+0

按名稱查找使用的文件'找到。 -name「x201612054lb8」' –

+0

我不知道確切的名稱 – user3130007

+0

爲什麼我們只允許一行? – slim

回答

0

要查找所有文件,並將它們按字母順序由當前的日期進行排序:

find . -name "*20161205*" | sort | sed ':a;N;$!ba;s/\n/ /g'

find . -name "*date*"會搶在當前目錄下的所有文件按日期(不包括前後)

sort it

sed將刪除新線

+0

不會做OP想要的。 – slim

+0

不是嗎?也許我誤解了。 '我需要找到最新的文件。如果找到具有相同最新日期的多個人。我需要按字母排序的最後一個文件。' –

+0

@ThomasBennett:我不認爲OP知道最新的日期會提前,所以你不能在搜索中對日期進行硬編碼。 – ShadowRanger

3

你可以給多個鍵定義來sort,所以:

ls | sort --key=1.2,1.9 --key=1.1,1.1 | tail -1 

這種種由字符2-9,然後用字符1,然後使用tail返回只有最後一行。其他回答使用find而不是ls。除非文件在子目錄之間傳播(如果它們是,你還有其他問題需要處理),或者如果有目錄和文件,那麼你不需要這樣做。


這是一個簡單的方法,但效率不高。如果您有10,000個文件,sort必須對10,000個條目列表進行排序,這是相當多的處理。

相反,如果你用你喜歡的腳本語言做(蟒蛇上下的僞代碼):

latest_file = read_line 
while(current_file = read_line): 
    if(current_file > latest_file): // by your priority rules 
     latest_file = current_file 
print latest_file 

而一個完整的排序需要在內存中的所有10,000個條目,該算法永遠只需要在內存中的兩個條目 - 目前的獲勝者,以及正在考慮的一項。


獎金解決方案,使用實際的Python這個時候:

ls | python -c 'import fileinput; print max(fileinput.input(), key=lambda s : s[1:9] + s[0:0])' 

(雖然如果你要打破Python的,它可能是時候讓Python的處理目錄閱讀,而不是建設混合殼/ Python的解決方案:python -c 'import os; print max(os.listdir("."), key=lambda x : x[1:9] + x[0:0])' - 和你問的shell)

+0

僅供參考,在實際Python中,['max'採用'key'函數](https://docs.python.org/3/library/functions.html#max),可以隱式執行這種循環在可迭代的輸入上(並且速度明顯更快)。 – ShadowRanger

+0

@ShadowRanger謝謝。由此產生的Python單線版本值得添加。 – slim

1

我認爲這應該工作:

find . -maxdepth 1 -type f -regextype posix-extended -regex '^.*\/[a-zA-Z][0-9]{8}[^/]*$' | sort | sort -k 1.4,1.12 -n -s | tail -n 1 

第一種排序按字母順序排序,第二種排序按日期數字進行穩定的數字排序(當鍵匹配時使其穩定保留原始字母排序),然後tail拉出最終值。

正則表達式確保它符合基本條件(字母后跟八位數字),因此您不會對垃圾進行排序和處理。

+1

結果以./ – user3130007

+0

@ user3130007開頭:好點,我的錯誤是用'ls'測試(這對於一般腳本來說是個壞主意,但很方便)。固定。 – ShadowRanger

1

我會用這樣的命令:

find -mindepth 1 -maxdepth 1 -printf '%f\n' | sort -k1.2,1.9g -k1 | tail -1 

,或者以相反的順序:

find -mindepth 1 -maxdepth 1 -printf '%f\n' | sort -r -k1.2,1.9g -k1 | head -1 
+0

這只是按字母順序排列。 OP想要按照字符2-9中的日期排序,*然後*按字母順序排列。 – slim

+0

@slim,謝謝。固定 –

相關問題