Bagaimana cara menghapus folder dengan hanya satu file di dalamnya?


1

Jadi saya rupanya memiliki ratusan "album" di folder musik saya dengan hanya satu file musik di dalamnya.

Saya tidak suka itu, saya hanya ingin album lengkap di folder itu.

Apakah ada solusi mudah untuk ini? Intinya alat yang menghapus semua folder dengan hanya satu file di dalamnya? Saya menggunakan Windows 7


OS apa yang Anda gunakan?
Karan

Maaf karena tidak menyebutkan itu. Lihat hasil edit
Forza

Jawaban:


1

Buka PowerShell ISE dan coba jalankan ini:

$targets = @()
$folders = dir "D:\Users\Forza\Music\" | Where {$_.mode -match "d"}
foreach ($folder in $folders) {
     if(
        ($folder.GetFiles() |
         Measure-Object |
         Select -ExpandProperty Count) -eq 1) 
        {$targets += $folder}
}
$targets | Format-Table -Property Name

Ini (harus) mengeluarkan daftar semua folder dengan satu file di dalamnya. Perhatikan baik-baik daftar dan pastikan tidak ada folder yang tidak disengaja. Kemudian Anda dapat menjalankan perintah:

foreach ($target in $targets){Remove-Item -Recurse -Force $target.FullName}

Ini akan menghapus semua folder yang terdaftar di $targets.

Jika Anda perlu memodifikasi skrip ini, ada baiknya Anda memahami apa yang dilakukannya. Sebagai contoh, Anda akan menghapus folder dengan subfolder tetapi tidak ada file di direktori pertama . Jadi, jika Anda memiliki sesuatu seperti C:\Users\Forza\Music\SomeArtist\SomeAlbum, seluruh direktori SomeArtist akan dihapus. Juga, folder kosong apa pun akan tetap ada.

Mari kita pergi baris demi baris:

  1. $targets = @() mendefinisikan sebuah array. Ini supaya kita bisa menambahkan $folder s untuk $targets tanpa melemparkan kesalahan dan pastikan itu $targets mulai kosong, daripada terus menambahkannya sambil memodifikasi skrip kami dan akhirnya menghapus lebih banyak folder daripada yang kami maksud.
  2. $folders = dir 'C:\Users\Forza\Music\' | Where {$_.mode -match "d"} daftar isi dari direktori yang ditentukan dan pipa yang menghasilkan ke Where-Object perintah. $_.mode -match "d" mengambil objek pipa dan memeriksa apakah mereka adalah direktori.
  3. foreach ($folder in $folders) { mulai perulangan melalui setiap folder
  4. if( memulai pernyataan if untuk memeriksa jumlah file di dalam folder. Saya telah membagi setiap baris untuk membuatnya membingungkan bisa dibaca
  5. $folder.GetFiles() | ini mengambil semua file di folder yang kami periksa. Perhatikan pipa, yang mengirimkan output ke perintah berikutnya pada baris berikutnya.
  6. Measure-Object | cukup jelas. Jika tidak, coba perintahnya Get-Help Measure-Object.
  7. Select -ExpandProperty Count) -eq 1) memilih dan memperluas Count properti sehingga kita dapat melihat apakah itu sama dengan ( -eq ) 1. Perhatikan dua kurung tutup, satu untuk ditutup ($folder.GetFiles() | Measure-Object | Select -ExpandProperty Count) dan satu untuk menutup if pernyataan.
  8. {$targets += $folder} menambahkan folder yang cocok dengan kriteria kami ke $targets daftar.
  9. } menutup loop foreach.
  10. $targets | Format-Table -Property Name menghapus daftar folder untuk dihapus.

Jika Anda ingin memodifikasi ini untuk menghapus folder kosong juga, cukup ubah -eq 1 untuk -lt 2. Dengan sedikit kreativitas Anda harus bisa mendapatkan skrip untuk menangani struktur file berantakan Anda sesuka Anda.


Untuk merawat folder Artis di bawah \ Music, ubah jalur ke sesuatu seperti C:\Users\Forza\Music\*\*\.


1
Anda bisa melakukannya pada awalnya dengan Remove-Item di tempat tetapi berikan parameter -WhatIf Kemudian hapus -WhatIf untuk melakukannya secara nyata.
EBGreen

Apa ide bagus untuk melakukan ini di PowerShell :) Sangat keren! Namun, ia mencantumkan folder dengan album lengkap di dalamnya .. Bisakah Anda memastikan kode ini melakukan apa yang ingin dilakukannya?
Forza

Solusi EBGreen tidak membuat daftar. Ia meminta saya per folder jika saya ingin menghapusnya. Saya tidak bisa menekan berlaku untuk semua karena akan menghapus folder yang memiliki sub-folder dengan beberapa file di dalamnya. Saya harus membuka setiap folder untuk memilih ya atau tidak untuk menghapusnya. Untuk Anda, saya tidak yakin apa yang dilakukannya. Periksa ini: piclair.com/data/q8g34.jpg Folder teratas Jack Johnson berisi 12 album, sedangkan 1 hanya memiliki satu mp3 di dalamnya. Saya tidak yakin apakah skrip Anda akan menghapus seluruh folder jack johnson, atau hanya yang rusak di dalamnya. Bisakah Anda jelaskan lebih banyak?
Forza

Anda dapat mengasumsikan bahwa selalu ada folder untuk artis yang berisi album.
Forza

@Forza Mencoba untuk menambahkan perubahan jalur dalam komentar tetapi Markdown memenangkan pertempuran. Saya pikir ini harus bekerja untuk solusi satu jalur EBGreen yang jauh lebih bersih juga.
Tanner Faulkner

1

Ini melakukannya untuk saya:

ls I:\temp | ?{$_.PSIsContainer} | ?{(ls $_.FullName | ?{-NOT $_.PSIsContainer}).Count -eq 1} | %{Remove-Item $_.FullName -WhatIf}

Hapus -Apa Jika Anda melakukannya untuk nyata. Perhatikan bahwa itu akan menghapus folder yang memiliki satu file di dalamnya bahkan jika itu memiliki sub-folder dengan lebih banyak file.


Ya, itu kerugiannya. Sekarang saya harus melalui ratusan folder untuk memilih ya atau tidak :(
Forza

Jadi Anda tidak ingin menghapus folder yang memiliki sub folder? Anda ingin menghapus hanya subfolder dengan satu file? Hapus seluruh pohon jika hanya ada satu folder di mana saja di dalamnya? Komputer adalah binatang yang sangat literal. Jika Anda tidak memberi mereka instruksi yang sangat spesifik, Anda biasanya tidak akan mendapatkan hasil yang Anda harapkan.
EBGreen

Iya nih. Dari folder musik utama saya, saya ingin menghapus semua folder artis, yang memiliki satu album dengan satu file di dalamnya. Tidak ada lagi :)
Forza

Jadi jika itu adalah folder dengan satu file di dalamnya dan sub-folder yang benar-benar kosong, Anda tidak ingin menghapusnya?
EBGreen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.