特定の拡張子を持つファイルのみを含むサブフォルダを削除する方法

特定の拡張子を持つファイルのみを含むサブフォルダを削除する方法

すべてのファイルに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$')" ]'

jsonspwanは、ディレクトリ内のすべてのファイルに拡張子が含まれている場合はtrueを返してコマンドを続行できるようにするサブシェルです。

rm -rf {} + 2> /dev/null

標準エラーを/ dev / nullにリダイレクトする空でないディレクトリは削除されます。

注:このソリューションは、通常のファイルが含まれていない見つかったフォルダを削除します。

テストを実行する前にデータをバックアップしてください。

最上位ディレクトリでコードを実行します。

テストが成功したら、エコーを削除します。

関連情報