Bash 清除历史内容文件夹

Bash 清除历史内容文件夹

我需要一个 bash 脚本来保留最新的“date_YYYY-MM-DD_HHMMSS”目录,删除其他目录

目录结构如下。标签中的目录是可变的并且会改变,即“环境”,可以是生产、暂存、开发。具体来说,我不会提前知道“产品名称”

/home/'USER'/'ENVIRONMENT'/Content/'productname'/'date_YYYY-MM-DD_HHMMSS'

我试过了

ls -t  .\directory | tail -n +1

find .\directory type f -mtime +1 

(这是在疯狂的时刻,我很高兴只保留最后几天的内容)

find . -maxdepth 6 -mindepth 5 -type f -printf '%f\n'

例如,如果我有以下内容

/home/USER1/production/Content/productname1/date_20151009_120000
/home/USER1/production/Content/productname1/date_20151010_120000
/home/USER1/production/Content/productname2/date_20151009_120000
/home/USER1/production/Content/productname2/date_20151010_120000
/home/USER1/production/Content/productname1/date_20151009_120000
/home/USER1/production/Content/productname1/date_20151010_120000
/home/USER1/staging/Content/productname2/date_20151009_120000
/home/USER1/staging/Content/productname2/date_20151010_120000

我会保留

/home/USER1/production/Content/productname1/date_20151010_120000
/home/USER1/production/Content/productname2/date_20151010_120000
/home/USER1/staging/Content/productname2/date_20151010_120000

答案1

awk您可以使用和的组合xargs来实现这一点,

sort -r directories | awk -F/ 'cache[$3, $4, $6]++' | xargs -L1 rm -rf

directories只是一个包含所有目录的文件,sort -r directories可以轻松地用管道替换(例如printf "%s\n" /home/*/*/Content/*/* | sort -r)。

sort -r将目录放置在列表的“顶部”(它利用了这样一个事实,即您的日期可以按字典顺序进行比较,如果不是,您必须首先正确解析它们)。最后awk进行记账,第一次看到 ( user, environment, product) 时它不会打印它,接下来的所有出现都会被打印。这会生成要删除的目录列表,然后通过xargs/删除该目录rm

注意:如果您的文件名/目录包含空格或“奇怪”字符,它将无法正常工作,因此您必须修改命令。


有什么awk -F/ 'cache[$3, $4, $6]++'作用?首先,它分割 上的输入行/。然后,对于每个输入行,它检查关联数组中是否存在包含第三个、第四个和第六个值的元组cache。第一次看到元组时,它不在数组中,因此cache[$3, $4, $6]返回0,因此该行被删除,然后++设置cache[$3, $4, $6]1。下次看到元组时cache[$3, $4, $6]会返回一些内容> 0,这意味着该行将被打印。

这是一个简单的例子:

$ cat example
a,c,0
a,a,2
c,a,0
a,b,2
b,a,2
a,b,0
c,a,1
b,b,0
a,b,1
a,a,1
a,a,0
b,a,1
b,c,2
b,b,2
b,c,1
a,c,1
c,c,1
$ awk -F, 'cache[$1, $2]++' example
a,b,0
c,a,1
a,b,1
a,a,1
a,a,0
b,a,1
b,b,2
b,c,1
a,c,1
$ fgrep a,b example
a,b,2
a,b,0
a,b,1
$

注意a,b,2线路是如何掉线的,a,b,0a,b,1没有掉线。使用关联数组和++运算符是 中非常常见的模式awk,例如参见43.删除重复的、不连续的行

相关内容