Directory

如何(安全地)刪除目錄中除文件之外的所有目錄?

  • October 15, 2018

環境

系統: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頂級目錄中應該存在的文件在哪裡。它將確保您不會錯誤地從不同的位置執行它。

額外的好處是您還可以在需要時為其添加邏輯。

引用自:https://unix.stackexchange.com/questions/475434