![Bash 清除历史内容文件夹](https://linux22.com/image/79069/Bash%20%E6%B8%85%E9%99%A4%E5%8E%86%E5%8F%B2%E5%86%85%E5%AE%B9%E6%96%87%E4%BB%B6%E5%A4%B9.png)
我需要一个 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,0
而a,b,1
没有掉线。使用关联数组和++
运算符是 中非常常见的模式awk
,例如参见43.删除重复的、不连续的行。