"Rm -rf" setara untuk Windows?

509

Saya perlu cara untuk menghapus folder dan anak-anaknya secara rekursif.

Apakah ada alat prebuilt untuk ini, atau apakah saya perlu menulisnya?

DEL /S tidak menghapus direktori.

DELTREE telah dihapus dari Windows 2000+

FlySwat
sumber
1
Apakah del / s (a) tidak berfungsi sama sekali (itu hanya tersedia dalam beberapa versi) atau (b) meninggalkan direktori tingkat atas tetapi menghapus semua yang ada di bawahnya atau (c) meninggalkan semua direktori sambil menghapus semua file?
Berkumandang
@ Harun, jawab c, Anda perlu menggunakan rmdir / s untuk menghapus direktori dan file.
Wedge
31
Bukankah itu benar-benar format c:pemasangan Linux? Saya bercanda tentu saja.
Basile Starynkevitch

Jawaban:

694

RMDIR atau RD jika Anda menggunakan Command Prompt (cmd.exe) klasik:

rd /s /q "path"

RMDIR [/ S] [/ Q] [drive:] path

RD [/ S] [/ Q] [drive:] path

/ S Menghapus semua direktori dan file di direktori yang ditentukan selain direktori itu sendiri. Digunakan untuk menghapus pohon direktori.

/ Q mode Diam, jangan tanya apakah ok untuk menghapus pohon direktori dengan / S

Jika Anda menggunakan PowerShell Anda dapat menggunakan Remove-Item(yang alias ke del, erase, rd, ri, rmdan rmdir) dan mengambil -Recurseargumen yang dapat disingkat untuk-r

rd -r "path"
Duncan Smart
sumber
84
Perlu ditunjukkan bahwa untuk sejumlah besar file, rmdir / s / q biasanya jauh lebih cepat daripada operasi "select dir, shift + delete" yang setara di explorer.
Wedge
9
Ini tidak menghapus file, seperti rm -rf, dan juga mengembalikan nilai bukan nol ketika direktori tidak ada, jadi rd /s /q foo && echo "yay"akan gagal jika direktori "foo" tidak ada.
Dirk Groeneveld
17
Bagaimana jika dir. tidak kosong dan beberapa file mendapatkan Access is denieddan yang lainnya The process cannot access the file because it is being used by another process?
Eugene
6
Saya baru saja mencoba ini dalam tujuh dan Anda perlu melakukan / S dan / Q (topi)
ford prefek
2
Bingung di sini. Saya tahu bahwa saya mencoba perintah ini dan tidak berfungsi jika ada file di pohon direktori; sekarang saya kembali dan. . . ajaibnya itu tampaknya berhasil. Apakah ada orang lain yang mengalami perilaku tidak konsisten dengan ini ?!
Alex Hall
139

admin:

takeown /r /f folder
cacls folder /c /G "ADMINNAME":F /T
rmdir /s folder

Bekerja untuk apa saja termasuk file sys

EDIT: Saya benar-benar menemukan cara terbaik yang juga memecahkan masalah jalur file terlalu lama:

mkdir \empty
robocopy /mir \empty folder
wbkang
sumber
3
Pahlawanku! Dan satu tip: Anda membuat folder kosong Anda di C: \ kosong, lalu sekali di dalam setiap folder gila, Anda bisa melakukannyarobocopy /mir c:\empty .
Léon Pelletier
Yang takeownmembantu saya ketika saya menyalin folder dari sistem Linux dengan rsync karena kesalahan dan saya tidak memiliki hak untuk menghapus folder itu ... Bahkan robocopy tidak berfungsi. Terima kasih
Jarda
1
Jawaban yang sangat bagus Berhasil. (semua jawaban lain pada halaman tidak). Tapi cacl sudah usang. Mungkinkah membuat jawaban kontemporer? Varian kedua sudah berfungsi dan tidak usang.
Gangnus
Ini tidak melakukan apa pun untuk saya. Bisakah seseorang tolong jelaskan bagaimana itu seharusnya bekerja? (robocopy) - Mungkin menghapus isi folder, tetapi bukan folder itu sendiri
Ralf
114

RMDIR [/S] [/Q] [drive:]path

RD [/S] [/Q] [drive:]path

  • /S Menghapus semua direktori dan file di direktori yang ditentukan selain direktori itu sendiri. Digunakan untuk menghapus pohon direktori.

  • /Q Mode diam, jangan tanya apakah ok untuk menghapus pohon direktori dengan /S

Jim McKeeth
sumber
13
Terima kasih atas penjelasan parameternya. Sayangnya, jawaban yang diterima tidak melakukan ini.
Thomas
1
Sederhana, jawaban sempurna untuk pertanyaan itu. Seharusnya yang diterima.
Artif3x
19

Anda dapat menginstal cygwin, yang telah rmdan lainnya ls.

pengguna17481
sumber
19

Pergi ke jalan dan memicu perintah ini.

rd /s /q "FOLDER_NAME"

/ s: Menghapus direktori yang ditentukan dan semua subdirektori termasuk file apa pun. Gunakan / s untuk menghapus pohon.

/ q: Menjalankan rmdir dalam mode senyap. Menghapus direktori tanpa konfirmasi.

/? : Menampilkan bantuan di prompt perintah.

Sireesh Yarlagadda
sumber
9

Untuk menghapus direktori (ada atau tidaknya) gunakan yang berikut:

if exist myfolder ( rmdir /s/q myfolder )
Tanah liat
sumber
6

rmdir /S /Q %DIRNAME%

Branan
sumber
6

Jawaban yang diterima sangat bagus, tetapi dengan asumsi Anda telah menginstal Node, Anda dapat melakukan ini lebih tepat dengan perpustakaan simpul "rimraf", yang memungkinkan pola globbing. Jika Anda sering menggunakan ini (saya lakukan), cukup instal secara global.

yarn global add rimraf

lalu, misalnya, pola yang saya gunakan terus-menerus:

rimraf .\**\node_modules

atau untuk one-liner yang memungkinkan Anda menghindari instalasi global, tetapi yang sedikit lebih lama untuk pengunduhan paket dinamis:

npx rimraf .\**\node_modules
Artif3x
sumber
2
Solusi yang solid untuk masalah ini karena OS-agnostik.
Denialos
5

Coba perintah ini:

del /s foldername
Jeremy Ruten
sumber
bekerja untuk saya dalam kombinasi w / rmdir / s / q karena beberapa file terkunci dan rmdir akan gagal pada mereka. del / foldername nuked file yang terkunci yang kemudian memungkinkan rmdir untuk menyingkirkan dir root. Bagus.
bbqchickenrobot
4

rmdir / s dirname

Brian Mitchell
sumber
4

Pertama, mari kita tinjau apa yang rm -rfdilakukan:

C:\Users\ohnob\things>touch stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>mkdir stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>ls -l
total 0

C:\Users\ohnob\things>rm -rf stuff.txt

Ada tiga skenario di mana rm -rfbiasanya digunakan di mana ia diharapkan untuk kembali 0:

  1. Jalur yang ditentukan tidak ada.
  2. Path yang ditentukan ada dan merupakan direktori.
  3. Path yang ditentukan ada dan merupakan file.

Saya akan mengabaikan hal izin keseluruhan, tetapi tidak ada yang menggunakan izin atau mencoba untuk menolak akses tulis sendiri pada hal-hal di Windows (OK, itu dimaksudkan untuk menjadi lelucon ...).

Pertama set ERRORLEVELke 0 dan kemudian hapus path hanya jika ada, menggunakan perintah yang berbeda tergantung pada apakah itu direktori atau tidak. IF EXISTtidak diatur ERRORLEVELke 0 jika jalur tidak ada, jadi pengaturan ERRORLEVELke 0 pertama diperlukan untuk mendeteksi kesuksesan dengan cara yang meniru rm -rfpenggunaan normal . Menjaga RDdengan IF EXISTitu diperlukan karena RD, tidak seperti rm -f, akan membuat kesalahan jika target tidak ada.

Cuplikan skrip berikut mengasumsikan bahwa DELPATH sudah diprioritaskan. (Ini aman ketika Anda melakukan sesuatu seperti SET DELPATH=%1. Cobalah menempatkan ECHO %1dalam .cmddan lewat itu argumen dengan ruang di dalamnya dan melihat apa yang terjadi untuk diri sendiri). Setelah cuplikan selesai, Anda dapat memeriksa kegagalan dengan IF ERRORLEVEL 1.

: # Determine whether we need to invoke DEL or RD or do nothing.
SET DELPATH_DELMETHOD=RD
PUSHD %DELPATH% 2>NUL
IF ERRORLEVEL 1 (SET DELPATH_DELMETHOD=DEL) ELSE (POPD)
IF NOT EXIST %DELPATH% SET DELPATH_DELMETHOD=NOOP
: # Reset ERRORLEVEL so that the last command which
: # otherwise set it does not cause us to falsely detect
: # failure.
CMD /C EXIT 0
IF %DELPATH_DELMETHOD%==DEL DEL /Q %DELPATH%
IF %DELPATH_DELMETHOD%==RD RD /S /Q %DELPATH%

Intinya adalah, semuanya lebih sederhana ketika lingkungan hanya sesuai dengan POSIX. Atau jika Anda menginstal MSYS minimal dan gunakan saja.

binki
sumber
3

Inilah yang perlu Anda lakukan ...

Buat file batch dengan baris berikut

RMDIR /S %1

Simpan file batch Anda sebagai Remove.batdan masukkanC:\windows

Buat kunci registri berikut

HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)

Luncurkan regeditdan perbarui nilai default HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)\default dengan nilai berikut

"c:\windows\REMOVE.bat" "%1"

Itu dia! Sekarang Anda dapat mengklik kanan direktori mana saja dan menggunakan fungsi RMDIR

Louis
sumber
3

Menggunakan Powershell 5.1

 get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force

Ganti log dengan nama direktori yang ingin Anda hapus.

get-childitem mencari direktori anak-anak dengan nama secara rekursif dari jalur saat ini (.).

hapus-item menghapus hasilnya.

n_y
sumber
2

Anda dapat menginstal GnuWin32 dan menggunakan perintah * nix secara native di windows. Saya menginstal ini sebelum saya menginstal apa pun pada salinan windows minty segar. :)

epochwolf
sumber
2

GUNAKAN RISIKO ANDA SENDIRI. INFORMASI YANG DISEDIAKAN 'APA ADANYA'. TIDAK DIUJI SECARA EXTENSIVELY.

Klik kanan ikon Windows (biasanya kiri bawah)> klik "Windows PowerShell (Admin)"> gunakan perintah ini (dengan hati-hati, Anda dapat dengan mudah menghapus semua file Anda jika Anda tidak hati-hati):

rd -r -include *.* -force somedir

Dimana somedir direktori tidak kosong yang ingin Anda hapus.

Perhatikan bahwa dengan disk yang dilampirkan eksternal, atau disk dengan masalah, Windows terkadang berperilaku aneh - tidak kesalahan dalam menghapus (atau upaya penyalinan), namun direktori tidak dihapus (atau tidak disalin) seperti yang diperintahkan. (Saya menemukan bahwa dalam kasus ini, setidaknya bagi saya, perintah yang diberikan oleh @n_y dalam jawabannya akan menghasilkan kesalahan seperti 'get-childitem: File atau direktori rusak dan tidak dapat dibaca.' Sebagai hasilnya di PowerShell)

Roel Van de Paar
sumber
1

TERLAMBAT TAPI JAWABAN PENTING untuk siapa saja yang mengalami masalah dalam menginstal paket npm di mesin windows dan jika Anda melihat kesalahan mengatakan " rm -rf..." perintah tidak ditemukan. Anda dapat menggunakan bash cli untuk menjalankan perintah rm di windows.

untuk pengguna npm, Anda dapat mengubah konfigurasi npm dengan npm config set script-shell "C:\Program Files\Git\bin\bash.exe"cara ini jika paket npm yang Anda coba instal memiliki skrip post install yang menggunakan rm -rfperintah, Anda akan dapat menjalankan rmperintah itu tanpa perlu mengubah apa pun dalam paket npm atau menonaktifkannya konfigurasi skrip instalasi pos. (Misalnya, styled-componentsgunakanrm perintah dalam skrip instal posting mereka)

Jika Anda hanya ingin menggunakan rmperintah, Anda dapat dengan mudah menggunakan bash dan meneruskan argumen.

Jadi ya, Anda dapat menggunakan perintah 'rm' di windows.

AKC
sumber
0

inilah yang bekerja untuk saya:

Coba kurangi panjang jalan. yaitu :: Ganti nama semua folder yang mengarah ke file tersebut ke nama sekecil mungkin. Ucapkan satu nama huruf. Terus ganti nama ke atas dalam hierarki folder. Dengan ini, Anda secara efektif mengurangi panjang jalur. Sekarang akhirnya coba hapus file itu segera.

Gaurav Deochakke
sumber
-1

Ada juga deltree jika Anda menggunakan versi windows yang lebih lama.

Saya sangat suka situs ini untuk menemukan perintah: SS64: Del - Hapus File

Jason Wadsworth
sumber
-2

del / s / q direktoritelahdihapus

joe
sumber
2
Coba tambahkan beberapa deskripsi / penjelasan.
Rajen Raiyarela