环境
系统:Linux Mint 19 Cinnamon。
Shell:Bash 版本 4.4.19(1)。
问题
除了数百个测试场景之外,我一定还创建了无数个暂时的以文件为内容的安装目录,我每次都需要手动删除。它看起来像这样:
$ ls --group-directories-first --classify
test1/ test2/ testA/ testFin/ decrypt-file-aes256* encrypt-file-aes256* Makefile openssl-encryption.tar.xz openssl-encryption.tar.xz.asc SHA512SUM
我想自动化这个清理过程。
进步
我发现该find
命令非常有用,例如:
find . -maxdepth 1 -type d -exec rm -rf {} +
在我从终端进行的早期测试中,这表明是有效的,但在我将其放入我的 Makefile、干净目标中之前,我想问是否有我应该考虑的安全措施?
然而,该示例产生了一个小错误:
rm: refusing to remove '.' or '..' directory: skipping '.'
如何在这里变得更具体?
当前重构的“干净”Makefile 目标
clean:
@echo; tput bold; tput setaf 3; echo Target: $@; tput sgr0; echo
@if [ $$(id --user) -eq 0 ]; then \
tput bold; tput setaf 1; echo "ERROR: Target '$@' has to be run as normal user!"; tput sgr0; echo; exit 1; \
fi
@if [ ! -f .safeclean-$(distrib_name) ]; then \
tput bold; tput setaf 1; echo "ERROR: Target '$@' has to be run from within its Makefile's directory!"; tput sgr0; echo; exit 1; \
fi
@ls -l | grep '^d' > /dev/null || echo "There are no more directories."
@for dir in *; do \
if [ -d "$$dir" ]; then rm --force --recursive --verbose "$$dir"; fi \
done
@rm --force --verbose $(distrib_name).tar.xz $(distrib_name).tar.xz.asc
@echo; tput bold; tput setaf 2; echo "Ok. Directory clean successful."; tput sgr0
示例输出(视觉)
答案1
首先,在 Makefile 中执行find
+操作之前请格外小心。rm
话虽如此,您可能会发现编写脚本更容易:
myclean:
test -f .safefile && \
for fn in * ; do \
test -d "$$fn" && rm -rf "$$fn" ; \
done
.safefile
其中应该存在于您的顶级目录中的文件在哪里。它将确保您不会错误地从不同的位置运行它。
额外的好处是您还可以在需要时向其中添加逻辑。