Shell脚本不执行删除文件

时间:2018-10-16 15:19:14

标签: bash shell

我具有以下脚本,用于从/ tmp和/ var / tmp目录中删除Web缓存和文件,以降低磁盘利用率。当我执行脚本时,它不会删除文件,什么也不会给出。

    #!/bin/bash

#set -x
#THRESHOLD=30
TEMP1=$(cd /tmp)
TEMP2=$(cd /var/tmp)
df -h | grep -v '^Filesystem' | awk '{print $1,$5}' | while read output;
do
  used=$(echo $output | awk '{print $5}' | cut -d '%' -f1)
  diskpart=$(echo $output | awk '{print $2}')
  if [[ "$used" -ge "30" ]]; then
    echo "Disk utilization percentage is more"
#    sync; echo 1 > /proc/sys/vm/drop_caches
    rm -rf "$TEMP1/*"
    rm -rf "$TEMP2/*"
  fi
done

以下输出:

srikant@ubuntu:~$ ./example.sh 
srikant@ubuntu:~$ ./example.sh 
srikant@ubuntu:~$ 

df -h命令输出:

srikant@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           393M   12M  382M   3% /run
/dev/sda1        19G  9.5G  8.2G  54% /
tmpfs           2.0G  272K  2.0G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
tmpfs           393M     0  393M   0% /run/user/121
tmpfs           393M   52K  393M   1% /run/user/1000

我在rm -rf之前并在执行脚本时尝试了sudo。但是仍然无法正常工作。 请帮忙。

1 个答案:

答案 0 :(得分:1)

生成output时,其中只有两个字段,例如,原始 $1和前$5中的awk '{print $1,$5}' /dev/sda154%。然后在:

used=$(echo $output | awk '{print $5}' | cut -d '%' -f1)

您只有这两个字段,因此awk '{print $5}'部分给出了一个空字符串。应该是:

used=$(echo $output | awk '{print $2}' | cut -d '%' -f1)

除此之外:

TEMP1=$(cd /tmp)
TEMP2=$(cd /var/tmp)

将为空字符串,因为cd不会在标准输出中写入任何内容。应该是:

TEMP1='/tmp'
TEMP2='/var/tmp'

在这种情况下,引号是可选的。

也:

 rm -rf "$TEMP1/*"

将查找名为*的文字文件,因为文件名扩展未在引号内完成!

编辑:我的首选解决方案是释放外部程序awkcut

temp1='/tmp'          # Avoid uppercase variable names
temp2='/var/tmp'      # they can collide with shell names

while read -r diskpart Size Used Avail Use Mounted
do
    # Remove the trailing %
    used=${Use%%%*}

    # A neater from of numeric comparison
    if (( used >= 30 ))  
    then
        echo "Disk utilization percentage is more"
        #sync; echo 1 > /proc/sys/vm/drop_caches

        # Note that putting * inside quotes won't be expanded
        rm -rf "$temp1"/*
        rm -rf "$temp2"/*
    fi
done < <(df -h)