Bash
保留同月的所有文件+之前的最新文件,刪除其余文件
我想要一個shell腳本,它保留與目前時間相同月份的所有文件+之前的最新文件,並刪除目錄中的其余文件。
儲存在目錄中的所有文件名的結構
name$timestamp.extension
如下timestamp=`date "+%Y%m%d-%H%M%S"`
因此,這意味著如果目錄中有以下文件:
name161214-082211.gz name161202-082211.gz name161020-082211.gz name161003-082211.gz name161001-082211.gz
執行此程式碼後目錄中的剩余文件將是:
name161214-082211.gz name161202-082211.gz name161020-082211.gz
PS。對外殼來說非常新。不僅希望有一個工作程式碼,而且還想學習。所以,如果你這麼好心,請解釋一下程式碼。謝謝!
你
zsh
可以做類似的事情# get current date (YYMM) in a variable crd=$(date "+%y%m") # use a function to extract the 13 chars that make up the timestamp dtts() REPLY=${${REPLY%%.*}: -13} # sort file names by the timestamp in descending order, exclude the ones with the # same YYMM as the current date and set the remaining file names as arguments set -- *(.O+dtts^e_'[[ "${${REPLY%%.*}: -13:4}" == "$crd" ]]'_) # remove the first item from the list (i.e. the last one before current month) shift # print the remaining file names print -rl -- "$@"
這使用參數擴展和glob 限定符:它首先使用函式選擇正常文件 (.)按時間戳
按降序 () 排序,然後如果時間戳匹配目前年份和月份(即如果引號內的表達式) ,則取反字元串取消選擇文件返回真);然後從列表中刪除第一項(因為名稱按降序排序,這將是當月之前的最新時間戳)如果您對結果滿意,請 替換為。
O``dtts``e``^e_'[[ "${${REPLY%%.*}: -13:4}" == "$crd" ]]'_``shift
print -rl``rm