Як видалити порожні папки за допомогою командного рядка Windows?


77

Мені потрібно видалити всі порожні папки з моєї папки програми за допомогою командного рядка Windows?

Як я можу створити такий файл bat?

Будь ласка, допоможи мені.

Відповіді:


53
for /f "usebackq" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"

з: http://blogs.msdn.com/b/oldnewthing/archive/2008/04/17/8399914.aspx

Звичайно, я б спершу протестував його, не видаляючи, перш ніж виконувати цю команду. Крім того, ось модифікована версія з коментарів, яка включає папки з пробілами:

 for /f "usebackq delims=" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"

PS У дописі в блозі є більше коментарів, які можуть вам допомогти, тому обов’язково прочитайте їх, перш ніж спробувати


1
Мені цей подобається. За посиланням тут згадується, що це простіше (аналогічно наведеному нижче):for /f "tokens=*" %%d in ('dir /ad/b/s ^| sort /R') do rd "%%d"
Бред В,

Де ви ставите шлях до папок?
MAGx2,

1
@ MAGx2 У мене теж було це запитання. Я не можу зрозуміти, як розміщувати зворотні цитати в коментарях, але я використовую ([backquote] dir / ad / b / s "c: \ path" [backquote])
Джейсон,

1
Якщо ви не використовуєте наведений вище рядок у командному файлі, то вам потрібно замінити %%dна%d
svandragt

1
Це легко зробити за допомогою ROBOCOPY. Дивіться мою відповідь нижче для деталей.
Варун Шарма

126

Ви можете скористатися ROBOCOPYкомандою. Це дуже просто, а також може використовуватися для видалення порожніх папок всередині великої ієрархії.

ROBOCOPY folder1 folder1 /S /MOVE

Тут і джерело, і місце призначення folder1, оскільки вам потрібно лише видалити порожні папки, замість того, щоб переміщувати інші (необхідні) файли в іншу папку. /Sваріант - пропустити копіювання (переміщення - у наведеному вище випадку) порожніх папок. Це також швидше, оскільки файли переміщуються всередині одного диска.


1
Полюбіть рішення для роботи з копією. ДЯКУЮ!
Buzzy Hopewell

1
Дуже мило! +1 за відповідь.
JasonXA,

1
відповідь на порятунок життя.
Джон Ву

2
Добре, це здається чудовим і працює! Я просто не розумію, чому, якщо запустити cmd з папки проекту, це дасть мені "ПОМИЛКА 32 (0x00000020) Видалення вихідного каталогу" - це означає, що він не може видалити основний каталог! Слава Богу, він не може видалити його, бо не повинен - ​​він не порожній! ("Процес не може отримати доступ до файлу, оскільки він використовується іншим процесом." - де файл повинен бути директорією). Я бігаю всередині нього за допомогою: robocopy. . / s / переміщення.
Педро Рейс

1
@PedroReis На мою думку, ви отримуєте цю помилку, намагаючись видалити / перемістити, поки дочірній файл / папка все ще відкрита. Якщо вам потрібна додаткова допомога, я вважаю, що краще опублікувати її як нове запитання, щоб інші, хто стикається з цією проблемою, могли знайти ваше питання та вирішити свою проблему.
Варун Шарма

58

Більш простий спосіб - зробити xcopy, щоб скопіювати всю структуру каталогів за допомогою перемикача / s. help for / s каже Копіює каталоги та підкаталоги, крім порожніх.

xcopy dirA dirB /S

де dirA є джерелом із порожніми папками. DirB буде копією без порожніх папок


1
Це має бути прийнятою відповіддю. Приємно і просто! Дякую!
еккес,

4
Додавши перемикач / I, наприклад, xcopy dirA dirB /SIбуде пропущено підказку "Чи вказує dirB ім'я файлу або ім'я каталогу на цілі?"
Люк Семпсон,

29
Я згоден, що це просто, але я маю структуру каталогів із понад 1 ТБ даних. Я не хочу це повторювати!
JYelton

Ви можете зробити щось подібне з RoboCopy, а не копіювати порожні папки. Я вважаю корисним, якщо ви копіюєте дані, але ні, якщо ви хочете обрізати порожні папки.
нд

5
Також майте на увазі, що це не копіює приховані та системні файли - включіть для цього прапор / h
SamStephens

16

Вам не потрібно usebackq:

FOR /F delims^= %%A IN ('DIR/AD/B/S^|SORT/R') DO RD "%%A"

5
Дякую Томе ... ти маєш рацію. однак у командному рядку він фактично використовував би один%, протилежний командному файлу. Користувачі: зверніть увагу, що RD не видаляє файли та каталог, що містить файли. просто порожні каталоги. Тож це абсолютно безпечно. FOR / F деліми ^ =% A IN ('DIR / AD / B / S ^ | SORT / R') DO RD "% A"

Якщо ви використовуєте cygwin, переконайтеся, що ви перевірили порядок шляхів, або явно вкажіть SORT до версії dos.
нд

8

До корозійної відповіді з тієї ж сторінки, на яку посилаються, додається версія PowerShell http://blogs.msdn.com/b/oldnewthing/archive/2008/04/17/8399914.aspx#8408736

Get-ChildItem -Recurse . | where { $_.PSISContainer -and @( $_ | Get-ChildItem ).Count -eq 0 } | Remove-Item

або, більш стисло,

gci -R . | where { $_.PSISContainer -and @( $_ | gci ).Count -eq 0 } | ri

заслуга належить автору публікації


3

Це гібрид із вищезазначеного. Він видаляє ВСІ файли старше X днів і видаляє всі порожні папки для вказаного шляху. Для використання просто встановіть дні, шлях до папки та диск

@echo off
SETLOCAL
set days=30
set folderpath=E:\TEST\
set drive=E:

::Delete files
forfiles -p %folderpath% -s -d -%days% -c "cmd /c del /q @path "

::Delete folders
cd %folderpath%
%drive%
for /f "usebackq delims=" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"`

1
хороший, але мені потрібно видалити apostrof в кінці останнього рядка для / f "usebackq delims =" %% d in ( "dir /ad/b/s | sort /R") do rd "%% d"
integratorIT

3

з командного рядка: для / R / D% 1 у (*) виконайте rd "% 1"

у пакетному файлі для / R / D %% 1 у (*) зробити rd "%% 1"

Не знаю, чи задокументовано це як таке, але він працює в W2K, XP та Win 7. І я не знаю, чи буде це працювати завжди, але файли випадково не видалятимуться.


1

Встановіть будь-який інтерпретатор UNIX для Windows (Cygwin або Git Bash) і запустіть cmd:

знайти / шлях / до / каталогу -порожній -тип d

To find them

знайти / шлях / до / каталогу -порожній -тип d -видалити

To delete them

(насправді не використовуючи підказку windows cmd, але це просто і зайняло кілька секунд)


Плюс десять за те, що в тому числі, як просто їх знайти .
Bob Stein

У моїй версії find перша команда працює, але при додаванні -delete там пише "недійсний предикат -delete"
OMA

1

Це буде відпрацьовано чудово. Це найкращий спосіб видалити старі файли та рекурсивно видалити порожні каталоги. наступний файл .bat,

forfiles /p [PATH] /s /m [FILE-PATTERN] /d -[DAYS] /c "cmd /c del @path"
for /f "delims=" %%d in ('dir [PATH] /s /b /ad ^| sort /r') do rd "%%d"

Замінювачі потрібно замінити наступним чином (без лапок):

[DAYS] = Max. age of the files in days, e.g. “10”
[PATH] = Path to search for old files and empty folders, e.g. “C:\Backup\”
[FILE-PATTERN] = Pattern that matches files to delete, e.g. “*.bkp”

Сценарій був успішно протестований під Windows 7 та Windows Server 2003.


0
@echo off
set /p "ipa= ENTER FOLDER NAME TO DELETE> "
set ipad="%ipa%"
IF not EXIST %ipad% GOTO notfound
IF EXIST %ipad% GOTO found
:found
echo DONOT CLOSE THIS WINDOW
md ccooppyy
xcopy %ipad%\*.* ccooppyy /s > NUL
rd %ipad% /s /q
ren ccooppyy %ipad%
cls
echo SUCCESS, PRESS ANY KEY TO EXIT
pause > NUL
exit 
:notfound
echo I COULDN'T FIND THE FOLDER %ipad%
pause
exit

0

Якщо ви хочете скористатися командним рядком ROBUN на варуні в контекстному меню Провідника (тобто клацніть правою кнопкою миші), тут імпортується реєстр Windows. Я спробував додати це як коментар до його відповіді, але вбудована розмітка була нездійсненною.

Я перевірив це на власному ПК з Windows 10, але використовую на свій страх і ризик. Він відкриє новий командний рядок, запустить команду і зробить паузу, щоб ви могли бачити результат.

  1. Скопіюйте в новий текстовий файл:

    Редактор реєстру Windows, версія 5.00

    [HKEY_CURRENT_USER \ Software \ Classes \ directory \ Background \ shell \ Delete Empty Folders \ command] @ = "C: \ Windows \ System32 \ Cmd.exe / C \" C: \ Windows \ System32 \ Robocopy.exe \ "% V \ "\"% V \ "/ s / move \" && PAUSE "

    [HKEY_CURRENT_USER \ Software \ Classes \ directory \ shell \ command Empty Folders \ command] @ = "C: \ Windows \ System32 \ Cmd.exe / C \" C: \ Windows \ System32 \ Robocopy.exe \ "% V \" \ "% V \" / s / move \ "&& PAUSE"

  2. Перейменуйте розширення .txt на .reg

  3. Двічі клацніть, щоб імпортувати.

Дякую Варуну Шармі за оригінал.
Кейсі Пламмер

-1

ну, просто швидка та брудна пропозиція щодо простої 1-рівневої структури каталогів без пробілів, [редагувати] та для каталогів, що містять лише ОДИН тип файлів, які я знайшов корисними (в якийсь момент з http://www.pcreview.co.uk /forums/can-check-if-folder-empty-bat-file-t1468868.html ):

for /f %a in ('dir /ad/b') do if not exist %a\*.xml echo %a Empty

/ ad: показує лише записи в каталозі
/ b: використовуйте відкритий формат (лише імена)

[редагувати] за допомогою простої зірочки для перевірки БУДЬ-ЯКОГО файлу (% a \ * вище) не буде працювати, дякую за виправлення

тому видалення буде:

for /f %a in ('dir /ad/b') do if not exist %a\*.xml rmdir %a

1
Наведений вище тест проходить, навіть якщо каталог порожній.
Steve Hollasch

@SteveHollasch дякую за коментар, я виправив код вище
hello_earth
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.