專案總結-Linux下批量刪除無用檔案
阿新 • • 發佈:2019-01-02
背景
有一個功能,需要定期清理指定資料夾下指定日期的無用檔案,檔案的儲存格式是目錄/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(); 這個操作。