Bash

刪除文件 - 根據文件名模式保持最新

  • April 29, 2019

我有一個包含很多文件的目錄。每個文件都有相同的模式<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

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