解決策

解決策

フォルダ内のフォルダ内にフォルダを含むフォルダがあります。一部のフォルダにはファイルがあり、一部のフォルダにはありません。ファイルがないすべてのディレクトリを見つけて削除して、ホームフォルダを整理したいと思います。たとえば、次のようになります。

だから私がこれから始めるなら:

  • 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

解決策

これを行うためのいくつかのスイッチの組み合わせがあるかもしれませんが、findPythonの方が簡単だと思います(そしてクロスプラットフォームなので、必要ではありません)。

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つのステップ間の時間はマイクロ秒単位で測定されるため、これは大きな問題ではありませんが、知っておくべきことです。

関連情報