答案 0 :(得分:2)
使用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"
修改强>
要不删除包含日期结构的目录以外的目录,请使用
之类的内容class Test
def takenothing() end
end
def wrapper( *args, **keys, &block )
keys.delete :key
Test.new.send :takenothing, *args, **keys, &block
end
wrapper key: 'nyeh'
答案 1 :(得分:1)
你可以用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
答案 2 :(得分:1)
您可以通过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
如果你实际上不想清除所有子文件夹,除了今天的文件,而只是那些匹配某些特定名称模式的子文件夹,那么实现这一目的的一种方法是将该模式插入到glob中for
命令。例如,这里
for d in /path/to/backuptest/*/+([0-9])-+([0-9])-+([0-9]); do
test "$(basename "$d")" = "$TODAY" || rm -rf "$d"
done
考虑删除的唯一文件/目录是那些名称由三个非空的,连字符分隔的十进制数字组成的文件/目录。如果有人喜欢的话,可以编写更准确地匹配日期字符串格式的模式,但是你想要模式的区别越多就越混乱。