除了几个特定的文件夹,如何递归删除每个文件和文件夹?

专业备份

有了Busybox ashShell,我希望清理该/opt文件夹。

清除意味着以递归方式删除每个文件和文件夹,除了一些不需要保留的排除路径。

回归 rm

# cd /opt && echo rm -rf \
   ./!(opt/etc/nginx|/opt/home|/opt/etc/config|/opt/usr/sbin|/opt/var/mlocate)
-sh: syntax error: unexpected "("

回归 find

这似乎可以完成工作:

 # cd /opt && find ./ ! -path "./etc" ! -path "./etc/config" ! \
     -path "./etc/config/*" ! -path "./etc/nginx" ! -path "./etc/nginx/*" ! \
     -path "./home" ! -path "./home/*" ! -path "./usr" ! -path "./usr/sbin" ! \
     -path "./usr/sbin/*" ! -path "./var" ! -path "./var/mlocate" ! \
     -path "./var/mlocate/*" -exec rm -f {} \;; cd -

有什么建议如何改善?-delete代替-exec rm -f {} \处理rm: can't remove '.' or '..'如何在不递归的情况下删除空目录rm -rf,换句话说,如何进行整合rmdir


注意:它是Busybox 1.24.2,shopt两者都不tac可用。定义的功能:

[, [[, addgroup, adduser, ar, arping, ash, awk, base64, basename, blkid, blockdev, brctl, bunzip2, bzcat,
cat, chgrp, chmod, chown, chroot, clear, cmp, cp, crond, crontab, cryptpw, cut, date, dd, delgroup, deluser,
devmem, df, diff, dirname, dmesg, dos2unix, du, echo, egrep, env, expr, false, fgrep, find, free, fsync,
getty, grep, gunzip, gzip, halt, head, hexdump, hostid, hostname, id, ifconfig, insmod, iostat, ip, ipaddr,
ipcalc, iplink, ipneigh, iproute, iprule, iptunnel, kill, killall, klogd, less, ln, lock, logger, login,
losetup, ls, lsmod, lsusb, md5sum, mkdir, mkfifo, mknod, mkswap, mktemp, more, mount, mv, nc, netmsg,
netstat, nice, nslookup, ntpd, od, passwd, patch, pgrep, pidof, ping, ping6, pivot_root, poweroff, printf,
ps, pwd, readlink, reboot, renice, reset, rev, rm, rmdir, rmmod, route, run-parts, sed, seq, setconsole,
setserial, sh, sha1sum, sha256sum, sha512sum, sleep, sort, start-stop-daemon, stat, strings, stty, su,
swapoff, swapon, switch_root, sync, sysctl, syslogd, tail, tar, tee, telnet, telnetd, test, time, top, touch,
tr, traceroute, true, tty, udhcpc, umount, uname, uniq, unix2dos, unlink, unlzma, unxz, unzip, uptime,
usleep, vconfig, vi, wc, wget, which, xargs, xz, xzcat, yes, zcat
斯蒂芬·查泽拉斯(Stephane Chazelas)

尝试:

cd /opt &&
  find . \( \
    -path ./etc/config -o \
    -path ./etc/nginx -o \
    -path ./home -o \
    -path ./usr/sbin -o \
    -path ./var/mlocate \) -prune -o \( \
      -type d -print0 -o -exec rm -f {} + \) |
    tr '\0\n' '\n\0' |
    tac |
    tr '\0\n' '\n\0' |
    xargs -r0 rmdir

-prune 确保我们甚至都不会输入那些跳过的目录。

我们删除其他目录中的非目录文件。并将目录留待以后处理(tac直到输出find完成为止,因为它从最后一行开始,否则将不输出任何内容)。

我们需要以相反的顺序传递目录列表,rmdir因为我们需要删除目录本身之前的内容。请注意,rmdir这不会删除非空目录。

通常用来-depth处理保留叶子的分支之前的叶子,但不能-depth与一起使用-prune出于相同的原因,我们不能-delete像它暗示的那样使用-depth

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我不小心删除了几个文件和文件夹

递归删除特定文件夹

如何删除特定文件夹下的文件和文件夹

删除文件和文件夹(例外)

帮助删除文件和文件夹

如何查找最近在Linux中删除了哪些文件和文件夹?

如何知道谁和何时在CentOS中删除了文件和文件夹?

如何删除无法删除的文件和文件夹?

移动文件和文件夹而不删除源文件夹的文件夹结构

如何使用rmtree()删除文件夹和文件

Git如何从git删除文件夹和文件?

如何只删除相同的文件和文件夹

如何使用命令行递归删除某个目录下的文件和文件夹?

如何从多个文件夹中删除文件,不包括几个文件夹?

意外删除了/ var文件夹

删除文件夹中的所有文件和文件夹,以结尾的文件和文件夹为准

如何删除文件夹

递归删除所有文件和文件夹,但不包括一个文件夹

如何在CMD中目录的每个文件夹中递归创建子文件夹

如何永久删除服务和文件夹?

除了删除文件和文件夹,还有其他类似scp的命令吗?

Windows 7中的递归文件和文件夹共享

在文件和文件夹的名称中递归填充0

删除空文件夹(递归)

递归删除python中的文件夹

Inno Setup:在“代码”部分递归复制文件夹,子文件夹和文件

如何递归比较两个文件夹并生成不同文件和文件夹的列表?

如何将文件夹及其所有子文件夹和文件递归设置为 drwxrwxrwx

删除子文件夹和文件而不删除父文件夹和子文件夹?