首页 > Linux > 使用shell脚本实现递归删除空目录

使用shell脚本实现递归删除空目录

平时一般使用php脚本实现一些文件管理功能,总归没有shell脚本强大,虽然本人不会写shell脚本,但是读懂shell脚本还是没问题的。对于“递归删除空目录”这样简单的功能使用php来写有点麻烦,从网上搜到这样一个shell脚本实现非常简单:

#!/bin/bash
# author: 十年后的卢哥哥
# des: delete empty directories recursive
deleteempty() {
  find ${1:-.} -mindepth 1 -maxdepth 1 -type d | while read -r dir
  do
    if [[ -z "$(find "$dir" -mindepth 1 -type f)" ]] >/dev/null
    then
      echo "$dir"
      rm -rf ${dir} 2>&- && echo "Empty, Deleted!" || echo "Delete error"
    fi
    if [ -d ${dir} ]
    then
      deleteempty "$dir"
    fi
  done
}
deleteempty

然后将这段代码保存为deleteempty.sh,然后将保存后的shell脚本放置到待删除的目录下,直接执行sh deleteempty.sh即可递归删除所有的空文件夹。

仔细读一下代码,发现作者其实已经实现了传参删除目录的功能,完全可以传入待删除目录的参数。于是,我将其改编如下:

#!/bin/bash
# author: 十年后的卢哥哥
# des: delete empty directories recursive
deleteempty() {
  find ${1:-.} -mindepth 1 -maxdepth 1 -type d | while read -r dir
  do
    if [[ -z "$(find "$dir" -mindepth 1 -type f)" ]] >/dev/null
    then
      echo "$dir"
      rm -rf ${dir} 2>&- && echo "Empty, Deleted!" || echo "Delete error"
    fi
    if [ -d ${dir} ]
    then
      deleteempty "$dir"
    fi
  done
}
name=$1
deleteempty "$name"

使用$1来获取第一个参数,然后传给deleteempty函数进行递归删除,亲测可用。

案例:建立一个test目录,将deleteempty.sh上传至test目录,其子目录结构如下,

[root@localhost test]# cd /test
[root@localhost test]# du -a
0       ./dir3/dirC/file5
4       ./dir3/dirC
8       ./dir3
4       ./dir2/dirA
8       ./dir2
4       ./dir4/dirD
0       ./dir4/file4
8       ./dir4
4       ./deleteempty.sh
4       ./dir5/dirE/dir_V
8       ./dir5/dirE
12      ./dir5
4       ./dir1
48      .

使用命令进行删除,删除后目录结构如下:

sh deleteempty.sh /test

[root@localhost test]# sh deleteempty.sh /test
/test/dir2
Empty, Deleted!
/test/dir4/dirD
Empty, Deleted!
/test/dir5
Empty, Deleted!
/test/dir1
Empty, Deleted!
[root@localhost test]# du -a
0       ./dir3/dirC/file5
4       ./dir3/dirC
8       ./dir3
0       ./dir4/file4
4       ./dir4
4       ./deleteempty.sh
20      .

很明显,与file4和file5相关的目录都没被删除,而空目录无论多深都被删除了。


再次改造一下,这里不再使用shell脚本,而是将该脚本转换为linux的命令——命令为deleteempty

[root@localhost test]# vi /usr/sbin/deleteempty
粘贴刚才的shell代码并保存退出
[root@localhost test]# chmod +x /usr/sbin/deleteempty

[root@localhost test]# which deleteempty
/usr/sbin/deleteempty

这时deleteempty可以作为一个简单的linux命令进行带参数删除,效果是一样的!



本文地址:http://blog.zhengshuiguang.com/linux/deleteempty.html

转载随意,但请附上文章地址:-)

标签:递归删除 空目录 shell脚本

评论已关闭