我想删除子文件夹,前提是它的所有文件都具有某种特定的扩展名,例如 json。我见过类似的问题查找并复制包含文件类型的目录。提前致谢。
├── 20101018_DSC05369.JPG
├── f
│ └── some.jpg
├── f1
│ ├── f
│ │ └── some.json
│ ├── f4
│ │ ├── a.jpg
│ │ └── some.json
│ └── some.json
└── some.jpg
exp. result:
.
├── 20101018_DSC05369.JPG
├── f
│ └── some.jpg
├── f1
│ ├── f4
│ │ ├── a.jpg
│ │ └── some.json
│ └── some.json
└── some.jpg
答案1
#! /bin/bash
# recursively
shopt -s globstar || exit
# for every subfolder
for dir in **;do
[[ ! -d $dir ]] && continue # if not directory then skip
# SUBFOLDER name inspected
echo "$dir"
# count number of files in subfolder
NUMFILES=$(find "$dir" -type f | wc -l)
# if non-empty folder
if (( $(bc <<<"$NUMFILES > 0") )); then
# if all files in folder have extension json, remove subfolder
NUMJSON=$(find "$PWD/$dir" -iname '*.json' | wc -l)
if (( $(bc <<<"$NUMFILES == $NUMJSON") )); then
echo "rm -rf "$dir""
rm -rf "$dir"
fi
fi
done
答案2
下面的一则内衬将解决您的问题:
sudo find . -links 2 -exec sh -c '[ "$(ls -l \{} | grep -c '^-')" \
-eq "$(ls \{} | grep -c '\.json$')" ]' \; -print0 | xargs -0 echo rm -rf {} + 2> /dev/null \;
代码解释:
sudo find . -links 2
在当前目录中只会返回叶目录。
ls -l \{} | grep -c '^-'
返回目录中常规文件的数量。
ls \{} | grep -c '\.json$'
json
返回目录中具有扩展名的文件的数量。
sh -c '[ "$(ls -l \{} | grep -c '^-')" -eq "$(ls \{} | grep -c '\.json$')" ]'
spwan 是一个子 shell,如果目录中的所有文件都有json
扩展名,则返回 true,从而允许指令继续进行。
rm -rf {} + 2> /dev/null
将删除将标准错误重定向到 /dev/null 的非空目录。
注意:此解决方案将删除找到的不包含任何常规文件的文件夹。
执行测试前请备份数据。
执行顶层目录中的代码。
当测试成功时删除 echo。