すべてのファイルに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$')" ]'
json
spwanは、ディレクトリ内のすべてのファイルに拡張子が含まれている場合はtrueを返してコマンドを続行できるようにするサブシェルです。
rm -rf {} + 2> /dev/null
標準エラーを/ dev / nullにリダイレクトする空でないディレクトリは削除されます。
注:このソリューションは、通常のファイルが含まれていない見つかったフォルダを削除します。
テストを実行する前にデータをバックアップしてください。
最上位ディレクトリでコードを実行します。
テストが成功したら、エコーを削除します。