ファイルが 1 つだけあるフォルダを検索する

ファイルが 1 つだけあるフォルダを検索する

C:\parent 内の 1 つのファイルのみを含むすべてのフォルダーを検索して削除する必要があります。フォルダー構造はフラットです (サブフォルダーはありません)。

C:\parent\folder1\file1
C:\parent\folder1\file2
C:\parent\folder2\file1 <-- Delete folder2
C:\parent\folder3\file1 <-- Delete folder3
C:\parent\folder4\file1
C:\parent\folder1\file2
C:\parent\folder1\file3

これを実行するためのプログラム/スクリプトを誰かお勧めできますか? ターミナル コマンドにあまり詳しくないので、何らかのウォークスルーがあると助かります。

ありがとう!

答え1

PowerShell を使えば簡単です:

cd C:\Parent
Get-ChildItem | Where-Object { $_.IsPSContainer -and @(Get-ChildItem $_).Count -eq 1 } | Remove-Item -Recurse

説明:

  • 2 行目は複数のコマンドで構成されており、各コマンドの出力は|(パイプ) 文字を使用して次のコマンドに送信されます。

  • Get-ChildItem現在のフォルダー内のすべてのファイルとフォルダーのリストを返します。

  • Where-Objectリストをフィルタリングして、条件に一致するフォルダーのみを取得できます。$_各反復の現在のオブジェクトを参照します。

    • $_.IsPSContainerフォルダーに対してのみ true を返すため、親ディレクトリ内のファイルを除外できます。

    • @(Get-ChildItem $_).Count -eq 1は、フォルダ内にファイルまたはサブフォルダが 1 つだけある場合にのみ当てはまります。この記号は、アイテムが 1 つしかない場合にプロパティが正しく機能する@ために必要です(Countここ説明についてはこちらをご覧ください。

  • ついに、Remove-Itemフィルターを通過した各フォルダーを削除します。-Recurse空でないフォルダーを自動的に削除するには、このパラメーターが必要です。このパラメーターがないと、PowerShell は毎回プロンプトを表示します。

答え2

小さなものを使った別の可能性としては、処理プログラム:

String parentFolder = "M:\\INSERT_PARENT_DIR_HERE";

void setup(){
  File fParentFolder = new File(parentFolder);
  println("Scanning " + fParentFolder.getAbsolutePath());
  println("Folder exists: " + fParentFolder.exists());
  File[] folderList = fParentFolder.listFiles();
  println("Number of files/folders: " + folderList.length);
  println("-----------------------------------");
  for(int i=0; i<folderList.length; i++){
    if(folderList[i].isDirectory() && folderList[i].list().length < 2){
      println("Deleting directory: " + folderList[i].getAbsolutePath() + "\t\t" + deleteDir(folderList[i]));  
    } 
  }
}


// Deletes all files and subdirectories under dir.
// Returns true if all deletions were successful.
// If a deletion fails, the method stops attempting to delete and returns false.
public static boolean deleteDir(File dir) {
    if (dir.isDirectory()) {
        String[] children = dir.list();
        for (int i=0; i<children.length; i++) {
            boolean success = deleteDir(new File(dir, children[i]));
            if (!success) {
                return false;
            }
        }
    }

    // The directory is now empty so delete it
    return dir.delete();
}

関連情報