簡體   English   中英

Shell腳本循環和刪除

[英]Shell script to loop and delete

有人可以幫我這個忙。我有下面的文件夾結構,如下所示。我想遍歷backuptest中的每個文件夾並刪除除今天日期文件夾之外的所有文件夾。我希望它作為cron作業運行

在此處輸入圖片說明

為此使用find

today="$(date +%Y-%m-%d)"
find /path/to/backuptest/Server* -mindepth 1 -maxdepth 1 -type d -not -name "$today" -exec rm -R {} \;

編輯

要不刪除除包含日期結構的目錄以外的目錄,請使用類似

find /path/to/backuptest/Server* -mindepth 1 -maxdepth 1 -type d  -regex ".*2016-[0-1]*[0-9]-[0-3][0-9]$" -not -name "$today"

您可以使用find做到這一點:

set date=`date +%Y-%m-%d`
find backuptest -type d -not -name $date -not -name "backuptest" -not -name "Server*" -exec rm -rf {} \;

這個:

find backuptest -type d -not -name $date -not -name "backuptest" -not -name "Server*"

將查找與以下名稱不同的目錄名稱:

backuptest
Server*
$date -> current date

並使用以下命令將其刪除:

rm -rf 

您可以通過date命令以所需的任何格式獲取今天的日期。 例如,

TODAY=$(date +%Y-%m-%d)

您可以使用簡單的通配符匹配來遍歷所需的子文件夾:

for d in /path/to/backuptest/*/*; do
  # ...
done

您可以使用basename命令從文件名中刪除目錄部分:

name=$(basename path/to/file)

您可以將其粘合在一起,如下所示:

#!/bin/bash

TODAY=$(date +%Y-%m-%d)

for d in /path/to/backuptest/*/*; do
  test "$(basename "$d")" = "$TODAY" || rm -rf "$d"
done

更新:

如果您實際上不希望清除除今天的子文件夾以外的所有子文件夾,而只清除那些與某些特定名稱模式匹配的子文件夾,那么一種完成該方法的方法是將該樣式插入for命令的glob中。 例如這里

for d in /path/to/backuptest/*/+([0-9])-+([0-9])-+([0-9]); do
  test "$(basename "$d")" = "$TODAY" || rm -rf "$d"
done

唯一被考慮刪除的文件/目錄是名稱由三個非空,連字符分隔的十進制數字組成的文件/目錄。 如果願意的話,可以編寫與日期字符串格式更精確匹配的模式,但是如果您希望該模式更具區分性,它的確會變得更加混亂。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM