11 ответов:
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"P. S. Есть еще комментарии в блоге, которые могут помочь вам, поэтому обязательно читайте их тоже, прежде чем попробовать это
вы можете использовать ROBOCOPY. Это очень простой, а также может быть использован для удаления пустых папок внутри большой иерархии.
ROBOCOPY folder1 folder1 /S /MOVEздесь оба источника и назначения
folder1, так как вам нужно только удалить пустые папки, а не перемещать другие(обязательные) файлы в другую папку./Sопция состоит в том, чтобы пропустить копирование (перемещение - в приведенном выше случае) пустых папок. Это также быстрее, как файлы перемещаются внутри того же диска.
более простой способ-сделать xcopy, чтобы сделать копию всей структуры каталогов с помощью переключателя /s. помощь /С говорит, что копирует каталоги и подкаталоги, за исключением пустых.
xcopy dirA dirB /Sгде dirA-источник с пустыми папками. DirB будет копией без пустых папок
добавление к разъеденному ответу с той же ссылочной страницы-это версия 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кредит идет автору публикации
из командной строки: для /R / D %1 in ( * ) do rd "%1"
в пакетном файле для /R / D %%1 in ( * ) do rd "%%1"
Я не знаю, задокументирован ли он как таковой, но он работает в W2K, XP и Win 7. И я не знаю, будет ли это всегда работать, но он никогда не будет удалять файлы случайно.
Это hybird выше. Он удаляет все файлы старше 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"`
установите любой интерпретатор UNIX для windows (Cygwin или Git Bash) и запустите cmd:
найти/путь/к / каталог-пустой тип d
To find themfind / path/to / directory-empty-type d-delete
To delete them(не совсем с помощью командной строки windows, но это легко и заняло несколько секунд, чтобы запустить)
@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
он будет работать нормально. Это лучший способ удалить старые файлы и удалить пустые каталоги рекурсивно. следующий.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.
ну, просто быстрое и грязное предложение для простой 1-уровневой структуры каталогов без пробелов, [edit] и для каталогов, содержащих только один тип файлов, которые я нашел полезными (в какой-то момент из 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: используйте голый формат (только имена)[edit] использование простой звездочки для проверки любого файла (%a\* выше) не будет работать, спасибо за исправления
поэтому удаление будет:
for /f %a in ('dir /ad/b') do if not exist %a\*.xml rmdir %a
Comments