Получить пустые имена файлов рекурсивно в командной строке

19

Я столкнулся с небольшим затруднением, пытаясь рекурсивно получить только имена файлов (без расширений и путей к файлам). Это сработало для меня в корневой папке:

dir /b

Но когда я добавил / s для рекурсивного сканирования, я также получил пути к файлам перед именами файлов, которые мне не нужны. Есть ли способ получить голые имена файлов из всех подпапок в каталоге?

Я на Windows 7 x64 Я бы предпочел использовать обычную командную строку не PS или VBS

TMRW
источник

Ответы:

15

Используйте следующую команду:

dir /b /a /s
  • / b удаляет дату и другие подробности из вывода
  • / a выводит только имя файла, без путей
  • / s включает рекурсивный список каталогов

Если вам нужно сохранить вывод в файл, вы можете использовать:

dir /b /a /s >> list_of_names.txt

РЕДАКТИРОВАТЬ На самом деле вышеупомянутое решение не достигает целей исходного вопроса. Из этого вопроса я заметил одну вещь: пост требует рекурсивного перечисления. чего нет в другом ответе, поэтому я думаю, что добавление "/ s" в ответе другого ответчика поможет

for /f %a in ('dir /b /s') do @echo %~na
Ник Со
источник
Не могли бы вы объяснить это? Для меня это мало что значит.
Саймон Шихан
4
Это не работает, / a не работает так - это фильтр для файлов того типа, который вы хотите перечислить. Он не удаляет путь от имени файла при выполнении рекурсивного просмотра каталога.
Gaff
отредактировал ответ; и только что получил в свои руки коробку с окнами снова, я думаю, что на этот раз должен это сделать (win732bit)
Nik So
6

Попробуй это:

for /f "delims=" %a in ('dir /b /s') do @echo %~na

Более подробную информацию о том, как работает и что он делает, введите for /?

Мультивселенная ИТ
источник
Это почти работает, но есть большая проблема. Он выводит только первое слово в имени файла. Если имя файла, например, «my отпускное изображение 1», то
выводится
попробуйте это: for / f "delims = |" % a in ('dir / b') do @echo% ~ na. По умолчанию параметр / f для FOR будет разбит на пробелы. Установка токена на символ, который не должен появляться в именах файлов / каталогов, даст вам полное имя, включая пробелы.
Скотт МакКинни
Если вы хотите, чтобы вывод отправлялся в файл, добавьте>> filename.txt
Gruber
2
for /r %i in (*) do @echo %~ni

или

forfiles /s /c "cmd /c if @isdir==FALSE noquotes.bat @fname"

предполагая файл noquotes.batв вашем % PATH% с этим содержимым

@echo %~1

для / г подхода объяснил

for /rрекурсивно просматривает текущий каталог (можно указать каталог for /r drive:\path\, предполагается, что текущий каталог) и выполняет команду, указанную do, для каждого файла, соответствующего в наборе (*). Набор (.)будет соответствовать только каталогам. @echo% ~ ni Эта команда работает как есть из приглашения. Удвойте свои кавычки, если вы положите их в пакетный файл. т.е.for /r %%i in (*) do @echo %%~ni

объяснил подход forfiles

/sперечисляет текущий и все подкаталоги,
/cвыполняет команду внутри кавычек
@isdirи @fnameявляется символом, выводимым в командную строку
. Дополнительный пакетный файл noquotes.batпомогает, удаляя двойные кавычки с% ~ 1 (параметр 1),
forfilesтакже позволяет указать путь, с которого следует начинатьforfiles /P C:\Windows ...

JJS
источник
@DavidPostill да, это был плохой ответ. Спасибо за ваши комментарии. Пожалуйста, дайте мне знать, если я могу улучшить свой ответ дальше.
JJS
@DavidPostill у вас нет предыдущего ответа или комментария. Вы модерировали вопросы или искали ответ и натыкались на мой некачественный ответ?
JJS
Ваш ответ появился в очереди на просмотр сообщений низкого качества. Поскольку я много знаю о пакетных файлах, я внимательно изучил их.
Дэвид Постилл
@DavidPostill спасибо за ваш отзыв. Я приветствую ваш обзор изменений, которые я внес в свой ответ.
JJS
Гораздо лучше ... :)
DavidPostill
-1

Перечислите все файлы, голые, рекурсивно, используя атрибуты (не каталог) (только файлы)

dir / B / S / A: -D

C: \ test \ cache> dir / B / S / A: -D

C: \ test \ cache \ 7 \ 0f \ 7b50ed0522645513da90345120eaf0f7 C: \ test \ cache \ d \ 23 \ 814644aa6a8195c91e54d2f7bb64e23d

Брэндон Хант
источник
В вопросе говорится, что ОП «пытается получить только имена файлов (без расширений или путей к файлам). … Но когда я [пытался dir /b /s] сканировать рекурсивно, я также получил пути к файлам перед именами файлов, которые мне не нужны ». Итак, вы говорите OP, чтобы попробовать тривиальный вариант того, что они уже пробовали, и ваш ответ демонстрирует что он дает тот же результат, что и при попытке ОП (т. е. не то, что они хотят).
Скотт,