Bash
刪除文件 - 根據文件名模式保持最新
我有一個包含很多文件的目錄。每個文件都有相同的模式
<id>_data_<date>.csv
。我想要做的是刪除所有文件,但保留最新的每個<id>
.範例目錄:
10020077_data_2017-07-18_001.csv 10020078_data_2017-07-18_001.csv 10020209_data_2019-04-23_001.csv 10020209_data_2019-04-24_001.csv 10020209_data_2019-04-25_001.csv 10020209_data_2019-04-26_001.csv 10020209_data_2019-04-27_001.csv 10020209_data_2019-04-28_001.csv 10020272_data_2019-04-23_001.csv 10020272_data_2019-04-24_001.csv 10020272_data_2019-04-25_001.csv 10020272_data_2019-04-26_001.csv 10020272_data_2019-04-27_001.csv 10020272_data_2019-04-28_001.csv 10020286_data_2019-04-23_001.csv
預期結果:
10020077_data_2017-07-18_001.csv 10020078_data_2017-07-18_001.csv 10020209_data_2019-04-23_001.csv <-- delete 10020209_data_2019-04-24_001.csv <-- delete 10020209_data_2019-04-25_001.csv <-- delete 10020209_data_2019-04-26_001.csv <-- delete 10020209_data_2019-04-27_001.csv <-- delete 10020209_data_2019-04-28_001.csv 10020272_data_2019-04-23_001.csv <-- delete 10020272_data_2019-04-24_001.csv <-- delete 10020272_data_2019-04-25_001.csv <-- delete 10020272_data_2019-04-26_001.csv <-- delete 10020272_data_2019-04-27_001.csv <-- delete 10020272_data_2019-04-28_001.csv 10020286_data_2019-04-23_001.csv
在這種情況下,我無法使用,
find -mtime
因為有些 id 每天都會獲取新文件,而另一些則每月只獲取一次,有時一年只獲取一次。我的想法是對每個 id 的文件名進行分組,而不是保留最後一項。我怎樣才能用 bash 解決這個問題?
這裡沒有特別需要 bash ;一個簡單的
sh
腳本可以做到這一點,使用位置數組兩次。外部循環獲取所有需要的數據文件(id 和 date 部分的萬用字元);它會拉出 id 部分,然後啟動一個子 shell 以遍歷具有該 id 的所有文件。然後,該子外殼循環遍歷這些文件的自然日期排序列表,並刪除除最後一個之外的所有文件,保留最新的文件。#!/bin/sh set -- *_data_*.csv for f in "$@" do id=${f%%_*} # a subshell so we don't clobber $@ ( set -- "${id}"_data_*.csv while [ "$#" -gt 1 ] do rm -- "$1" echo "DELETE: $1" shift done ) done
我添加了一條
echo ... DELETE
語句,以便我可以展示您提供的文件名的結果:DELETE: 10020209_data_2019-04-23_001.csv DELETE: 10020209_data_2019-04-24_001.csv DELETE: 10020209_data_2019-04-25_001.csv DELETE: 10020209_data_2019-04-26_001.csv DELETE: 10020209_data_2019-04-27_001.csv DELETE: 10020272_data_2019-04-23_001.csv DELETE: 10020272_data_2019-04-24_001.csv DELETE: 10020272_data_2019-04-25_001.csv DELETE: 10020272_data_2019-04-26_001.csv DELETE: 10020272_data_2019-04-27_001.csv