如何删除仅包含特定扩展名的文件的子文件夹

如何删除仅包含特定扩展名的文件的子文件夹

我想删除子文件夹,前提是它的所有文件都具有某种特定的扩展名,例如 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。

相关内容