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

В каталоге dir /s /b перечислены все файлы, включая файлы в текущем каталоге. Это не то, что я хочу.

2 ответа2

2

Используйте Powershell:

 Get-ChildItem .\*\*

Редактировать:

Приведенный выше пример действительно получает только 2-й уровень или каталоги, а не содержимое подпапок.

Ответ гостя лучше:

Get-ChildItem -Directory | ForEach-Object {Get-ChildItem -Recurse | Select-Object FullName}
1

Есть несколько решений, которые я постараюсь объяснить одно за другим.

партия
1) for /d %i in (*) do @dir /b /s "%i"
(*) распространяется на все файлы в текущем каталоге. Затем for /d перебирает все каталоги, кроме обычных файлов, выполняя dir /b /s для каждого каталога. Поскольку for команд, выполняемых эхом, @ используется для подавления эха.

2) for /f "delims=" %i in ('dir /b /A:D') do @dir /b /s "%i"
'dir /b /A:D' возвращает все каталоги в текущем каталоге, каждый каталог находится в одной строке. "delims=" указывает for /f не маркировать строку, а назначить всю строку %i . for /f затем перебирает все строки, выполняя dir /b /s для каждой строки.

Используйте %%i вместо %i в командном файле.

Powershell
dir *\* возвращает файлы только в каталогах уровня 2.
dir -recurse *\* также возвращает файлы в более глубоких каталогах, но не показывает пустую папку на уровне 2.

Правильные команды, которые используют тот же подход, что и в пакетном режиме:
1) dir | where {$_.PsIsContainer} | foreach {dir -recurse $_} | foreach {echo $_.fullname}

2) dir -directory | foreach {dir -recurse $_} | foreach {echo $_.fullname}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .