Directory
如何(安全地)刪除目錄中除文件之外的所有目錄?
環境
系統:Linux Mint 19 肉桂。
外殼: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、clean 目標之前,我想問一下我是否應該考慮任何安全措施?
但是,該範例會產生一個小錯誤:
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
範例輸出(視覺)
首先,在 Makefile 中執行
find
+之前請格外小心。rm
話雖如此,您可能會發現編寫腳本更容易:
myclean: test -f .safefile && \ for fn in * ; do \ test -d "$$fn" && rm -rf "$$fn" ; \ done
.safefile
頂級目錄中應該存在的文件在哪裡。它將確保您不會錯誤地從不同的位置執行它。額外的好處是您還可以在需要時為其添加邏輯。