如何在执行find命令前检查目录是否为空,或抑制空目录下的find命令警告?
解决空目录下find命令的警告问题
我来帮你搞定这个问题!首先得理清你当前遇到的两个核心问题:一是调用函数时带*导致空目录下通配符展开失败,二是原函数的逻辑其实不符合你“保留目录和.gitignore”的需求(原函数会直接删掉目标目录本身)。
问题根源
你调用rm_exclude_gitignore '/path-to-something/*'时,当目标目录为空,Shell没法把*展开成目录里的文件/文件夹,所以$1就变成了字面量/path-to-something/*。find命令去查找这个不存在的路径,自然会抛出“No such file or directory”的警告。另外原函数里的第一个find命令是删除目标目录本身,这显然不是你想要的结果。
修正后的解决方案
这里给你两个实用的版本,按需选择:
版本1:先检查目录内容再执行(无警告更严谨)
这个版本会先确认目录存在,再检查是否有需要删除的内容(排除.gitignore),只有存在内容时才执行删除操作,从根源避免警告:
rm_exclude_gitignore (){ # 用local变量存储目标目录,避免全局变量污染 local target_dir="$1" # 先检查目标目录是否存在 if [ ! -d "$target_dir" ]; then echo "Error: Directory '$target_dir' does not exist." >&2 return 1 fi # 检查目录内是否有除.gitignore外的其他内容 local non_ignore_content non_ignore_content=$(ls -A "$target_dir" | grep -v '^\.gitignore$') if [ -n "$non_ignore_content" ]; then # 删除目录内所有非.gitignore的文件和子目录(不删除目录本身) find "$target_dir" -mindepth 1 ! -name '.gitignore' -exec rm -rf {} + fi }
版本2:直接抑制错误输出(简洁高效)
如果不想做额外检查,直接把find的错误输出重定向到/dev/null,空目录时的警告就不会显示了:
rm_exclude_gitignore (){ local target_dir="$1" if [ ! -d "$target_dir" ]; then echo "Error: Directory '$target_dir' does not exist." >&2 return 1 fi # 执行删除并把错误输出丢到/dev/null find "$target_dir" -mindepth 1 ! -name '.gitignore' -exec rm -rf {} + 2>/dev/null }
正确调用方式
不管用哪个版本,调用时直接传目录路径即可,不要加*:
rm_exclude_gitignore '/path-to-something'
这样既符合你“保留目录和.gitignore、删除其他所有内容”的需求,又彻底解决了空目录下的警告问题。
内容的提问来源于stack exchange,提问作者clarkk
相关产品推荐
相关产品推荐

