フォルダ内のフォルダ内にフォルダを含むフォルダがあります。一部のフォルダにはファイルがあり、一部のフォルダにはありません。ファイルがないすべてのディレクトリを見つけて削除して、ホームフォルダを整理したいと思います。たとえば、次のようになります。
だから私がこれから始めるなら:
mainFolder
folder1
folder1
(空)folder2
file.txt
folder3
(空)
folder2
folder1
(空)folder2
(空)folder3
folder1
folder1
(空)
folder3
folder1
file.txt
私はそう終わらなければならない:
mainFolder
folder1
folder2
file.txt
folder3
folder1
file.txt
だから:
/mainFolder/folder1/folder1
ファイルがないため削除されました/mainFolder/folder1/folder3
ファイルがないため削除されました/mainFolder/folder2
ファイルがなく、サブフォルダもすべて空で削除されました。
これが意味があることを願っています...
mainFolder
私の唯一のアイデアは、各サブフォルダから始まり、再帰的に下に移動して空のサブフォルダを削除することです。
答え1
これがあなたの要件を満たしていることを確認してください。
find mainFolder -depth -empty -type d -exec rmdir {} \;
mainFolder
深さ優先トラバーサルを使用して空のディレクトリを見つけ、そのディレクトリを削除する必要があります。深さ優先トラバーサルを実行するため、子ディレクトリを削除するときに親ディレクトリが空の場合は空であるとfind
認識し、一緒に削除します。
答え2
find
-delete
以下をサポートする実装を使用してください-empty
。
find mainFolder -type d -empty -delete
これにより、ルートディレクトリ構造の深さ優先探索が実行され、mainFolder
その中の空のディレクトリがすべて削除されます。
使用標準find
:
find mainFolder -depth -type d -exec sh -c 'rmdir "$1" 2>/dev/null' sh {} ';'
rmdir
これは以下を使用しようとしますすべてmainFolder
深さ優先方式で構造を探索するときのディレクトリです。rmdir
空でないディレクトリは削除できないため、空のディレクトリのみが削除されます。エラーはrmdir
削除されます。
実行する前に各ディレクトリを明示的にテストしてくださいrmdir
。
find mainFolder -depth -type d -exec sh -c 'd="$1"; set -- "$d"/*; [ ! -e "$1" ] && rmdir "$d"' sh {} ';'
ただし、これはディレクトリに隠しファイルがないと仮定します。
答え3
解決策
これを行うためのいくつかのスイッチの組み合わせがあるかもしれませんが、find
Pythonの方が簡単だと思います(そしてクロスプラットフォームなので、必要ではありません)。
import os
top = './mainFolder'
for root, dirs, files in os.walk(top, topdown=False):
for name in dirs:
dir_path = os.path.join(root, name)
if not os.listdir(dir_path): # An empty list is False
os.rmdir(os.path.join(root, name))
設定とテスト
ファイルディレクトリの作成
# https://stackoverflow.com/a/246128/295807
readonly script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$script_dir"
rm -rf mainFolder
mkdir -p mainFolder/{folder1/{folder1,folder2,folder3},folder2/{folder1,folder2,folder3/folder1/folder1},folder3/folder1}
touch mainFolder/folder1/folder2/file.txt
touch mainFolder/folder3/folder1/file.txt
テスト:
$ tree mainFolder/
mainFolder/
├── folder1
│ ├── folder1
│ ├── folder2
│ │ └── file.txt
│ └── folder3
├── folder2
│ ├── folder1
│ ├── folder2
│ └── folder3
│ └── folder1
│ └── folder1
└── folder3
└── folder1
└── file.txt
12 directories, 2 files
Pythonスクリプトを実行します。
python work.py
テスト:
$ tree mainFolder/
mainFolder/
├── folder1
│ └── folder2
│ └── file.txt
└── folder3
└── folder1
└── file.txt
4 directories, 2 files
注:Pythonがフォルダが空であることを確認し、実際に削除する前にフォルダにファイルを追加すると、Pythonで例外が発生します。実際、これらの2つのステップ間の時間はマイクロ秒単位で測定されるため、これは大きな問題ではありませんが、知っておくべきことです。