--UNIX新手--
我正在尋找一個UNIX命令,根據日期邏輯洗掉目錄中的一些檔案。檔案結構樣本:
Aug 30 01:30 Test20210830.ctl
Aug 30 01:30 Test20210830.txt
8月3日 01:30 測驗20210803.ctl
8月3日 01:30 Test20210803.txt
8月2日 01:30 Test20210802.ctl
8月2日 01:30 測驗20210802.txt
8月1日 01:30 測驗20210801.ctl
8月1日 01:30 測驗20210801.txt
7月1日 01:30 測驗20210701.ctl
7月1日 01:30 測驗20210701.txt
6月16日 01:30 測驗20210616.ctl
6月16日 01:30 測驗20210616.txt
6月15日 01:30 Test20210615.ctl
Jun 15 01:30 Test20210615.txt
ls -ltr Test* | grep date %b | head -2 -- 這個命令給出了我想保留的前兩個檔案(每個月的前兩個檔案)。
我想洗掉同月的其他檔案(所以7月和6月的2個檔案仍然必須存在)。有一個作業在每個月末運行,所以......
什么是最好的?
什么是最好的方法來洗掉這些檔案并保留我想要的檔案?
uj5u.com熱心網友回復:
如果你想只保留每個月的前兩個按詞匯表排序的檔案名,你可以使用一個簡單的回圈和shell檔案名擴展:
for year in 2021
do
for month in {01.12}.
do do
set -- Test${year}${month}*。
if [ "$#"/span> -gt 2 ]
then
shift 2
echo would rm -- "$@"/span>
fi
done
done done
注意,這將洗掉Test20210616.ctl和Test20210616.txt,因為它專門轉移了每個月的前兩個檔案名。
這個腳本的核心部分是在set和shift 2部分。set -- Test${year}${month}*行擴展了年和月的變數,并附加了*通配符,以匹配任何/所有以 "Test "開頭的檔案名和回圈的當前年和月值。一旦這些檔案名被擴展 -- 或不被擴展! -- 它們可以在特殊的$@陣列變數中找到。注意,如果沒有匹配,陣列中會有一個值--未展開的 "Test"...通配符。如果我們需要知道是否有一個實際檔案名匹配,這將是一個需要注意的特殊情況,但在這里我們只對有兩個以上的匹配情況感興趣。由此產生的檔案名(如果有的話)將以詞典順序添加到陣列中。
一旦檔案名在$@中,shift 2簡單地從串列的前面彈出前兩個元素 - 這里,前兩個檔案名(按詞匯學排序)。剩下的是一個或多個檔案名,它們是要被洗掉的候選檔案。
移除echo would,以便啟用這個功能,如果結果看起來正確的話。
uj5u.com熱心網友回復:
我已經把你提供的輸入放在一個名為input的檔案中。
這段代碼可以安全運行,因為它實際上并沒有洗掉檔案,但你可以自己看到輸出。它告訴你哪個檔案將被洗掉,哪個檔案將被保留,在每個部分的末尾有一些不言自明的行。
它只是簡單地計算到目前為止它看到這個月的次數,如果超過兩次,它就輸出洗掉檔案。否則,它將列印出檔案保留!。
下面附上輸出結果。
lastmon=""/span>
counter=0
# 用你的 "ls -l "替換 "cat input",或者這樣。
cat input | egrep -o "S $" | sort -r | # extract filenames
for filename in $(cat)
do
# 從檔案名中提取碎片。
echo "檔案名。$filename"。
echo -n "date: "
echo $filename | egrep -o ' [0-9] '
echo -n "月。"
echo $filename | egrep -o '[0-9] '/span> | cut -b5-6
# compare month to last month
mon="$(echo $filename | egrep -o '[0-9] ' | cut -b5-6)"/span>
if [ "x$mon"/span> != "x$lastmon"/span> ]
then counter=0
fi
lastmon="$mon"/span>
# keep counting
counter=$((counter 1))
echo counter: $counter
# if more than two in a row decide to remove file[/span]。
if [ $counter -gt 2 ] 。
then echo result: removing file
else echo 結果:檔案保留!
fi fi 結果:檔案保留!
echo # print empty line
done
輸出
filename: Test20210830.txt [39/1872]
日期: 20210830
月。08
計數器。1
檔案保持不變!
檔案名:Test20210830.ctl
日期: 20210830
月份 08
計數器:2
檔案保持不變!
檔案名:Test20210803.txt
日期: 20210803
月份 08
計數器。3
洗掉檔案
檔案名:Test20210803.ctl
日期: 20210803
月份 08
計數器。4
洗掉檔案
檔案名:Test20210802.txt
日期: 20210802
月份 08
計數器。5
洗掉檔案
檔案名:Test20210802.ctl
日期: 20210802
月份 08
計數器。6
洗掉檔案
檔案名:Test20210801.txt
日期: 20210801
月份 08
計數器。7
洗掉檔案
檔案名:Test20210801.ctl
日期: 20210801
月份 08
計數器。8
洗掉檔案
檔案名:Test20210701.txt
日期: 20210701
月份 07
計數器。1
檔案保持不變!
檔案名:Test20210701.ctl
日期: 20210701
月份 07
計數器:2
檔案保持不變!
檔案名:Test20210616.txt
日期: 20210616
月份 06
計數器。1
檔案保持不變!
檔案名:Test20210616.ctl
日期:20210616
月份 06
計數器:2
檔案保持不變!
檔案名:Test20210615.txt
日期: 20210615
月。06
計數器。3
洗掉檔案
檔案名:Test20210615.ctl
日期:20210615
月份 06
計數器。4
洗掉檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/318320.html
標籤:
上一篇:從大檔案中獲取URL串列
下一篇:根據起始字母過濾出單詞
