2016-10-17 2 views
0

У меня есть папка-структура выглядит следующим образом:итерацию файлы в подпапках

c:/ 
    myDir/ 
    matchingDirName/ 
     myFile1.ext 
    notMatchingDirName/ 
     myFile2.ext 
    anotherDir/ 
    matchingDirName/ 
     myFile3.ext 

То, что я хочу, чтобы получить все файлы с данным расширением ext, которые расположены в папке matchingDirName внутри любого родительского каталога ,

Так что мне нужен какой-то шаблон для файла следующим образом: <folder>/matchingDirName/*.ext.

Я Allready попробовал это, что дает мне файл не найден:

cd c: 
for /f %%i in ('dir /a-h-s /b "*/matchingDirName/*.ext"') do echo %%i 

Есть ли способ, чтобы получить только те файлы, которые находятся в данной папке?

В моем примере должны быть возвращены как myFile1.ext, так и myFile3.ext.

+0

Если вы знаете, в какую папку вам нужно попасть, почему бы вам не сделать каталог изменений вплоть до этой подпапки? – Squashman

+0

@Squashman Поскольку я не знаю его родительскую папку и, следовательно, не могу позвонить в каталог изменений, я обновил вопрос соответствующим образом. Поэтому мне нужно получить эти 'ext'-файлы в папке с именем' /matchingDirName/*. Ext'. – HimBromBeere

+0

Это частично часть проблемы, но не решает всей проблемы. Выполнение 'cd c:' не изменяет рабочий каталог на c: \. Вы либо указываете 'C:' или 'CD/D C: \\' – Squashman

ответ

0
dir /s /b /a-d c:\*.ext | findstr /r /c:"\\matchingDirName\\[^\\]*$" 

поисковых запросов все ext файлы и фильтровать список, используя регулярное выражение, чтобы печатать только те файлы, которые хранятся внутри имени каталога соответствия

Теперь, чтобы пройти по списку внутри пакетного файла

for /f "delims=" %%a in (' 
    dir /s /b /a-d c:\*.ext ^| findstr /r /c:"\\matchingDirName\\[^\\]*$" 
') do (
    echo File found : "%%a" 
) 
+0

@HimBromBeere, 1) ответ обновляется 2) Нет, нет абсолютного пути. Он проверяет только имя родительской папки файла '.ext'. –

+0

Ничего себе, работает отлично. Я пропустил '^', чтобы избежать символа pipe перед 'findstr'. Спасибо за вашу помощь – HimBromBeere

+0

Я предлагаю добавить переключатель '/ I' в' findstr', чтобы обрабатывать имена каталогов без учета регистра, как и сама ОС Windows ... – aschipfl

1

в случае глубина иерархии каталогов точно так, как вы показали в вашей выборке, следующие работы:

@echo off 
for /D %%A in ("C:\*.*") do (
    for /D %%B in ("%%~fA\*.*") do (
     if /I "%%~nxB"=="matchingDirName" (
      for %%C in ("%%~fB\*.ext") do (
       echo "%%~fC" 
      ) 
     ) 
    ) 
) 

Первые две вложенные петли for /D перечисляют каталоги (/D) первого и второго уровней иерархии каталогов. Запрос if /I проверяет чистое имя каталога второго уровня (%%~nxB) на предопределенное имя без учета регистра (/I). Цикл самого внутреннего for выполняет итерацию через все файлы *.ext в соответствующих каталогах.


Для произвольной глубины иерархии каталогов, используйте следующее:

@echo off 
for /R "C:\" %%A in ("*.ext") do (
    for %%B in ("%%~dpA.") do (
     if /I "%%~nxB"=="matchingDirName" (
      echo "%%~fA" 
     ) 
    ) 
) 

Наружный for /R цикл перечисляет все файлы *.ext во всей иерархии каталогов рекурсивно (/R). Внутренний цикл for получает родительский каталог каждого файла *.ext (%%~dpA.), поэтому он повторяется только один раз для каждого файла; например, текущий файл равен C:\myDir\matchingDirName\myFile1.ext, поэтому %%~dpA. расширяется до C:\myDir\matchingDirName\., что эквивалентно C:\myDir\matchingDirName; целью этого цикла является извлечение чистого имени каталога (%%~nxB, например, matchingDirName). Запрос if /I проверяет это имя каталога на предопределенное имя без учета регистра (/I).

+0

Не должно быть 'if/I '% % ~ пв "==" matchingDirName "'? Вы сравниваете имена dir, у которых нет расширения. – HimBromBeere

+0

Зависит от того, хотите ли вы рассматривать или отклонять расширения в имени каталога; Предположим, что ваш 'matchDirName' на самом деле' Matching' и найден каталог 'Matching.dir', часть' .dir' игнорируется при использовании модификатора '~ n' ... – aschipfl

+0

И модификатор' ~ nx' будет справиться с этим? Не знал этого. Спасибо за подсказку. – HimBromBeere

Смежные вопросы