bash脚本改进需要通过dirs 12小时循环,删除里面的符号链接并删除目录

时间:2014-01-23 16:37:30

标签: linux bash shell scripting cron

我已经完全破解了这个脚本,我希望得到一些更正,或者对一个更简单的版本的一些见解,我知道这是可能的......

我想遍历一个已命名的目录并检查每个子目录,如果它包含任何X分钟旧的子目录,如果是,则删除旧的子目录。每个符合条件的子目录只包含1个符号链接。

对于此结构/ var / www / flash / avmin / {$ usr_id} / {$ timestamp} / { - > symlink}

我想保留/ {$ usr_id}但是如果+12小时删除所有/ {$ timestamp},我认为这意味着我需要在删除它之前将其清空。

因为在创建$ timestamp和符号链接时,可能会在同一服务器实例中创建/ {$ usr_id},所以我必须遍历每个/ {$ usr_id}子目录并从那里测试条件。

我将使这个脚本每12小时运行一次,Cron以root身份运行,因此在一个24小时内,所有符号链接都将保证干净。

注意../{$usr_id}中可能有几个{$ timestamp}子目录,但每个子目录只包含1个符号链接而不包含任何其他内容。

我觉得这可能是一行或两行代码而没有for ... in并且只是在avmin中使用find(-maxdepth 2)和X小时(或X分钟)的时间条件正确??? / p>

#!/bin/bash

for i in /var/www/flash/avmin/*
do
    cd "$i"
    for xdir in "$i"
    do
        if [ "$xdir" type d -cmin +60 ]; then
            find . -maxdepth 2 -type L -cmin +60 -exec rm {} \
        "$xdir" -type d -cmin +60 -exec rm {}
    fi
        done
done
exit

我看到一个“类似的问题”给了我一个想法here

1 个答案:

答案 0 :(得分:1)

我一点也不确定我正在回答正确的问题(请编辑你的问题以清楚说明你需要做什么,因为现在示例脚本没什么意义......]

到目前为止我猜到了:

1)你想看看/ var / www / flash / avmin / * /下面的每个目录1级,只看那些超过60分钟的目录

2)那么你想在这些目录中删除超过60分钟的所有链接吗?

通过这些猜测:

#!/bin/bash

export NBMIN=60

#find all subdirs jsut underneath each /var/www/flash/avmin/*/ that are $NBMIN minutes old
for xdir in $(find /var/www/flash/avmin -type d -mindepth 2 -maxdepth 2 -cmin +${NBMIN} ) 
do
   #for those dirs, delete symlinks "just underneath", that are older than $NBMIN minutes
   find "$xdir" -mindepth 1 -maxdepth 1 -type L -cmin +${NBMIN} -exec echo rm '{}' \;
   #and then if there is nothing else in that dir, delete it:
   command rmdir "$xdir" #without -f and -r... will only remove "$i" directory if it's empty!
done

当然,这只适用于每个目录和文件只是“普通”名称(即,不包含空格,以及其他奇怪的字符,如“换行符”或其他)... Stephane可能会弹出Zsh“** /”细节的答案;)

我不确定这是你想要的(并且请测试它...并且只有当你100%确定它只列出了它时才删除“echo”(所以“echo rm”变成“rm”)你想看的文件消失了!(例如,我不确定你只想查看超过60mn的目录?)