1.

1.

Busybox 쉘을 사용하여 폴더 ash를 정리하고 싶습니다 /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 -

개선 방법에 대한 제안이 있으십니까? ?handle ? -delete대신 사용하세요 . 재귀 없이 빈 디렉터리를 삭제하는 방법 , 즉 통합하는 방법은 무엇입니까 ?-exec rm -f {} \rm: can't remove '.' or '..'rm -rfrmdir


참고: 이는 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

답변1

노력하다:

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

답변2

1.

jlliagre의 답변을 바탕으로찾기 - -delete를 사용하여 rm 실행 \;더 나은 대안은 파일 시스템에 존재하는 모든 일치 항목에 대해 명령을 실행하지 않음으로써 이 절을 최적화하는 것입니다 +.execrm

2.

! -path "./"생성하지 않으려면 추가 비용이 필요합니다 rm: can't remove '.' or '..'.

관련 정보