1. 程式人生 > >專案總結-Linux下批量刪除無用檔案

專案總結-Linux下批量刪除無用檔案

背景

有一個功能,需要定期清理指定資料夾下指定日期的無用檔案,檔案的儲存格式是目錄/yyyyMMddHH/xx.txt,資料夾以小時命名的,現在要定期刪除某些日期的檔案。用java呼叫Shell命令的rm -rf 目錄/日期*的方式總數不成功,初步判斷正則表示式沒有匹配成功,所以沒有執行刪除操作。

解決辦法

編寫一個Shell指令碼檔案來刪除,引數傳遞需要刪除的日期列表,然後迴圈拼接刪除命令完成操作,如下Shell檔案命名為rmfile.sh。

#!/bin/sh

basePath=$1
dates=$2
date=${dates//,/ }
for element in $date
do
  echo
$basePath*/$element* rm -rf $basePath*/$element* done

例如:用Java的Process呼叫該Shell指令碼檔案,傳遞引數,示例程式碼:

rmfile.sh /mydata/ 20170613,20170614

之所以想起總結這個簡單問題,是因為早上看到了一篇介紹Shell的迴圈結構的文章,剛剛想起這個簡單指令碼中用到了for迴圈,也是鞏固學習的過程。

補充

Java呼叫Shell檔案的簡單方法程式碼如下:

   public static List<String> executeShell(String shpath, String
var){ String shellVar = (var==null)?"":var; String command1 = "chmod 777 " + shpath; // 為 sh 新增許可權 String command2 = "/bin/sh " + shpath + " " + shellVar; log.debug("執行shell指令碼開始:"+command2); List<String> strList = new ArrayList<String>(); Process process = null
; BufferedReader in = null; try { process = Runtime.getRuntime().exec(command1); // 執行新增許可權的命令 process.waitFor(); // 如果執行多個命令,必須加上 process = Runtime.getRuntime().exec(command2); process.waitFor(); in = new BufferedReader(new InputStreamReader(process.getInputStream())); String str = null; while ((str = in.readLine()) != null) { strList.add(str); } } catch (IOException e) { } catch (InterruptedException e) { }finally { if(in != null){ try { in.close(); } catch (IOException e) { } } if(process != null){ process.destroy(); } } return strList; }

說明:如果需要同步等待Shell檔案的執行結果必須有process.waitFor(); 這個操作。