Bash

保留同月的所有文件+之前的最新文件,刪除其余文件

  • December 24, 2020

我想要一個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

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