Linux
獲取名稱包含小於或等於給定輸入日期的日期值的文件
我的一個文件夾包含以下格式的文件:
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 作為兩個八位數字進行比較。