2012-04-03 3 views
3

Я пытаюсь получить список путей всех подкаталогов (рекурсивно), которые имеют определенное имя, например. "bin". Проблема в том, что если текущий каталог содержит подкаталог этого имени, команда DIR будет выполняться только внутри этого подкаталога, игнорируя другие подкаталоги.Список всех подкаталогов с указанным именем

Пример:

C:\DEVELOPMENT\RESEARCH>ver 

Microsoft Windows [Version 6.1.7601] 

C:\DEVELOPMENT\RESEARCH>dir *bin* /ad /s /b 
C:\DEVELOPMENT\RESEARCH\bin 
C:\DEVELOPMENT\RESEARCH\Apache\2bin 
C:\DEVELOPMENT\RESEARCH\Apache\bin 
C:\DEVELOPMENT\RESEARCH\Apache\bin1 
C:\DEVELOPMENT\RESEARCH\C#\ConsoleApps\MiscTests\bin 

C:\DEVELOPMENT\RESEARCH>dir bin* /ad /s /b 
C:\DEVELOPMENT\RESEARCH\bin 
C:\DEVELOPMENT\RESEARCH\Apache\bin 
C:\DEVELOPMENT\RESEARCH\Apache\bin1 
C:\DEVELOPMENT\RESEARCH\C#\ConsoleApps\MiscTests\bin 

C:\DEVELOPMENT\RESEARCH>dir bin /ad /s /b 
C:\DEVELOPMENT\RESEARCH\bin\test  

C:\DEVELOPMENT\RESEARCH>rmdir bin /s /q 

C:\DEVELOPMENT\RESEARCH>dir bin /ad /s /b 
C:\DEVELOPMENT\RESEARCH\Apache\bin 
C:\DEVELOPMENT\RESEARCH\C#\ConsoleApps\MiscTests\bin 

C:\DEVELOPMENT\RESEARCH> 

dir *bin* /ad /s /b выводит все подкаталоги, которые имеют bin в их имени. И этот выход в порядке. То же самое с dir bin* /ad /s /b, который выводит все подкаталоги, имя которых начинается с bin. Но dir bin /ad /s /b выводит только содержимое первого дочернего элемента текущего каталога с именем bin. Требуемый выход:

C:\DEVELOPMENT\RESEARCH\bin 
C:\DEVELOPMENT\RESEARCH\Apache\bin 
C:\DEVELOPMENT\RESEARCH\C#\ConsoleApps\MiscTests\bin 

Как я могу это достичь?

ПРИМЕЧАНИЕ. Если текущий каталог не содержит дочернего элемента bin, выход будет таким, как ожидалось. (Я удалил bin ребенка, чтобы показать это)

ответ

5

Если ваш текущий каталог содержит подкаталог bin, то это трудно, используя стандартные команды DOS. Я думаю, что у вас есть три основных варианта:

# Option 1: FOR and check directory existance (modified from MBu's answer - the 
# original answer just appended 'bin' to all directories whether it existed or not) 
# (replace the 'echo %A' with your desired action) 
for /r /d %A in (bin) do if exist %A\NUL echo %A 

# Option 2: PowerShell (second item is if you need to verify it is a directory) 
Get-ChildItem -filter bin -recurse 
Get-ChildItem -filter bin -recurse |? { $_.Attributes -match 'Directory' } 

# Option 3: Use UNIX/Cygwin find.exe (not to be confused in DOS find) 
# (you can locate on the net, such as GNU Utilities for Win32) 
find.exe . -name bin 
find.exe . -name bin -type d 
+0

Вариант 1 делает работу. Я на самом деле пишу короткий скрипт, который удаляет подкаталоги с заданным именем. Я объединил ваш ответ (так его примет) с некоторыми другими командами и получил то, что хотел. Большое спасибо! –

+0

вариант 1 - не работает в Vista с NUL. Сохраните \, но удалите NUL, и он работает в Vista. Также следует использовать кавычки. если существует "% A \" – dbenham

+0

@dbenham Хорошая точка в кавычках. Я удивлен, что NUL не работает на Vista. Я тестировал на Win7 и Win2008, и это сработало, и статья (DOS Testing if drive ...) относится к Win 3.11, поэтому я ожидал, что она будет работать практически для всего. – Ryan

3

Это должно работать:

for /R /D %A in (*bin*) do echo %A 
Смежные вопросы