Shell脚本循环和删除

时间:2016-09-01 18:17:23

标签: linux bash shell cron sh

有人可以帮我解决这个问题。我的文件夹结构如下图所示。我想遍历backuptest中的每个文件夹并删除除今天日期文件夹以外的所有文件夹。我希望它作为cron作业运行

enter image description here

3 个答案:

答案 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

考虑删除的唯一文件/目录是那些名称由三个非空的,连字符分隔的十进制数字组成的文件/目录。如果有人喜欢的话,可以编写更准确地匹配日期字符串格式的模式,但是你想要模式的区别越多就越混乱。