環境
システム: Linuxミント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に入れる前に考慮すべき安全対策があるかどうか尋ねたいと思います。
ただし、この例では小さなエラーが発生します。
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
最上位ディレクトリに必要なファイルはどこにありますか?誤って他の場所で実行しないようにします。
追加ボーナスは、必要に応じてロジックを追加できることです。