在我的脚本中,我有一个用于从目录中删除所有文件的命令www
。
rm -rf www/*
但是,在某些情况下该www
目录是空的。然后他命令整个脚本失败。
有没有更好的命令我可以使用,不会在空目录上失败?
编辑:如果隐藏文件没有被删除,那就完美了,因为我想保留该.gitkeeep
文件。我可以接受的最坏情况... && touch .gitkeep
答案1
使用 POSIX find
:
find www -path 'www/[!.]*' -prune -exec rm -r -- {} +
根据设计,如果不提供参数, find 不会失败。看说明书中的示例8这清楚地表明了这一点。
选项含义:
-path
指定我们只查找以 开头www/
并且后面没有点的路径(因此它从删除列表中排除隐藏文件)。-prune
防止 find 尝试在目录中下降(您已经在使用rm -r
,它可以做到这一点)。--
inrm -r -- {} +
允许处理找到的文件,即使它们以连字符开头。
答案2
有一个简单的方法纯bash(仅限内置):
即使你使用
set -e
要在非零退出错误时停止脚本,您可以执行以下操作:
shopt -s nullglob # don't treat * literally
shopt -u dotglob # don't match .dotfiles
rm -rf www/* 2>/dev/null || true
# < hide err>< >
# only if set -e
答案3
find www -mindepth 1 -maxdepth 1 -exec rm -r -- {} +
如果.gitkeep
在www
目录中,那么您可以执行以下操作:
find www -mindepth 1 -maxdepth 1 ! -name .gitkeep -exec rm -r -- {} +