Linux

獲取名稱包含小於或等於給定輸入日期的日期值的文件

  • January 17, 2022

我的一個文件夾包含以下格式的文件:

3_20150412104422154033.txt
3_2015041211022775012.txt
3_20150412160410171639.txt
3_20150412160815638933.txt
3_20150413161046573097.txt
3_20150413161818852312.txt
3_20150413163054600311.txt
3_20150413163514489159.txt
3_2015041321292659391.txt
3_20150414124528747462.txt
3_20150414125110440425.txt
3_20150414134437706174.txt
3_20150415085045179056.txt
3_20150415100637970281.txt
3_20150415101749513872.txt

我想檢索日期值小於或等於我的輸入日期值的那些文件。

例如,如果我給出“3_20150414”,即 (3_YYYYMMDD),我希望輸出是文件名

3_20150412104422154033.txt
3_2015041211022775012.txt
3_20150412160410171639.txt
3_20150412160815638933.txt
3_20150413161046573097.txt
3_20150413161818852312.txt
3_20150413163054600311.txt
3_20150413163514489159.txt
3_2015041321292659391.txt
3_20150414124528747462.txt
3_20150414125110440425.txt
3_20150414134437706174.txt

我可以通過發出如下命令來列出文件:

ls -l | grep '20150413\|20150414' |awk '{print $NF}'

但我正在努力尋找**<=**匹配。

您可以使用awk和它的字元串比較運算符。

ls | awk '$0 < "3_20150415"'

在一個變數中:

max=3_20150414 export max
ls | LC_ALL=C awk '$0 <= ENVIRON["max"] "z"'

在此處與“z”連接可確保比較是字元串比較,並允許當天的任何時間,因為在C語言環境中,數字排在z.

zsh中,您還可以執行以下操作:

print -rC1 -- *.txt(e['[[ $REPLY < ${max}z ]]'])

grep本身沒有 ≤ 運算符,但有一種笨拙的方法來偽造它。您希望從 0 年(或 1 年;以第一年為準)到 20150414 之間的所有日期。(我假設 BC 日期不在表中。)將此範圍分解為可以由正則表達式匹配的子範圍:

  • 從 0 年到 1999 年——所有年份都以 0 或 1 開頭,因此 grep 為[01].

(所有正則表達式都將被假定錨定在行首,緊跟在“3_”之後。)

  • 2000 年到 2009 年 - 正則表達式200
  • 2010 年到 2014 年 - 正則表達式201[0-4]
  • 2015 年第 1 個月至第 3 個月 — 20150[1-3].
  • 2015 年第 4 個月第 1 天至第 9 天 —2014040
  • 2015 年第 4 個月第 10 天到第 14 天 —2014041[0-4]

然後把它們放在一起:

grep -E '3_([01]|200|201[0-4]|20150[1-3]|2015040|2015041[0-4])'

ls -l當然,它會為您提供很多關於您不需要的文件(模式、所有者、修改時間等)的資訊,因此您可以awk '{print $NF}'將其刪除,只留下文件名。這是低效且容易出錯的(如果文件名中有空格或製表符,它會中斷)。解析輸出ls從來都不是一個好主意,但是你可以通過讓它更簡單一點來讓它更安全一點:只是不要得到你不想要或不需要的資訊,然後你就不需要丟棄它.

ls | grep -E '3_([01]|200|201[0-4]|20150[1-3]|2015040|2015041[0-4])'

應該足夠好。

但是建構這個由六部分組成的正則表達式既乏味又容易出錯,而且很難(儘管並非不可能)編寫腳本。這是一種更清潔的方法:

ls | awk 'substr($1, 3, 8) <= 20150414'

這將提取從第 3 個位置(即“3_”之後)開始的八個字元,並將其與 20150414 作為兩個八位數字進行比較。

引用自:https://unix.stackexchange.com/questions/199554