Windows-эквивалент подстановочного знака в каталоге ls * (звездочка)?


14

Еще один вопрос от давнего пользователя Unix / Linux, который оказался в мире Windows. Сначала позвольте мне объяснить, что именно я пытаюсь сделать. Я использую оболочку Windows cmd.exe, и я хочу перечислить все каталоги ниже текущего каталога, которые содержат иерархию bin \ Debug, и определить, содержат ли они какие-либо файлы (например: пытаюсь выяснить, является ли моя цель очистки NAnt чистой работает правильно). Моя иерархия может выглядеть примерно так:

\Current
    \DirA
         \bin
             \Debug
                  (some files under debug)
             \Release
    \DirB
         \bin
             \Debug
    \DirC
         \bin
             \Release

В Unix, ls */bin/Debugпросто дал бы мне список всех вещей в DirA/bin/Debugи показал бы факт, что DirB/bin/Debugэто пусто. Я пробовал разные искажения в оболочке cmd, но продолжаю заводиться с такими вещами, как:

    > dir * \ bin \ Debug
    Неверный синтаксис имени файла, имени каталога или метки тома.

    > dir * \ * \ *
    Неверный синтаксис имени файла, имени каталога или метки тома.

Есть ли что-то тонкое, чего я не понимаю в команде dir, или она ограничена таким образом?

Да, я понимаю, что могу просто переключиться в проводник, перемещаться, щелкать правой кнопкой мыши и, возможно, в конечном итоге создать поиск, который делает то, что я хочу, но меня больше интересует решение командной строки quick-n-dirty.


Хотя приятно знать обо всех Unix-подобных инструментах, которые я могу добавить в Windows (и, поверьте мне, я использую Cygwin дома!), Я не всегда буду иметь их в наличии везде, где бы я ни находился (и на самом деле может не иметь права администратора на установите их на каждом компьютере, который я использую).
Огрский псалом33

Ответы:


13

Нечто подобное должно делать то, что вы хотите. В корневом каталоге проекта введите:


c:\path\to\slndir>dir *.dll *.exe /s /b | findstr /i "bin\debug"

Аргументы dir: / s - рекурсивный, / b - "голый", без дополнительной информации
Аргументы findstr: / i - игнорировать регистр

В общем, команда help покажет справку для команд оболочки. Если это не сработает, тогда
' command /?' как правило, покажет помощь.


Отлично! Я понимаю, что есть много инструментов / наборов инструментов, которые помогут мне «линуксировать» мою Windows, но я искал способ Windows сделать то, что я пытаюсь сделать, и это именно так!
Огрский псалом33

7

Windows не использует подстановочные знаки так, как Linux. Только часть имени файла может содержать символы подстановки.

Вы можете скачать версию ls для Windows и использовать ее. Я использовал Cygwin , но я уверен, что есть и другие.


Также PowerShell
Джоэл Коухорн

3
Следует иметь в виду еще одну вещь: в Windows символы подстановки расширяются командой, а не оболочкой.
Лоуренс Гонсалвес

2

У unxutils есть команда ls. Однако проблема действительно в оболочке Windows. В Unix ваша оболочка расширится */bin/Debugдо соответствующих имён путей и передаст их команде ls в качестве отдельных аргументов командной строки.

Cygwin, безусловно, справится с задачей, или вы можете попробовать порт windows в оболочке Unix, такой как bash . Если вы хотите пойти по пути написания сценариев, вы можете довольно легко кодировать что-то на python, используя модуль glob , и большинство других языков сценариев имеют аналог.


2

Вы можете сделать что-то вроде "dir / s * .obj * lib". В конце будет дана сводка по количеству совпавших файлов.


Близко. Я дал вам реквизит, но ответ Джеймса ближе, так как он отфильтровывает файлы, которые не находятся в \ debug для меня.
Огр псалом33

2
@for /D /r %P in (.) do @for %Q in ("%~fP\bin\Debug\*") do @echo %~ftzaQ

Не приятно, но должно работать. Вы также можете поместить в файл .cmd (затем заменить каждый% на double %%). Или определите макрос, используя doskey (да, он все еще существует).

Убедитесь, что расширения cmd включены.

РЕДАКТИРОВАТЬ: Как это работает:

Первый цикл for выполняет итерацию по всем подкаталогам (переключатели / D и / r). % ~ fP раскрывает полный путь к этому каталогу. Затем он добавляет \ bin \ Debug * к этому пути. Второй цикл for перечисляет все совпадающие файлы. % ~ ftzaQ расширяется до каждого совпадения файла и выводится на экран с помощью echo. Странный% ~ ftzaQ форматирует его как вывод dir. Символ @ позволяет избежать вывода команд на экран.

Для получения дополнительной информации см.


Я попробовал это, и это действительно работает. Но будучи немного неопытным в оболочке cmd, я еще не совсем все понимаю :-).
Огр псалом33

0

В мире Windows cmd.exe не расширяет подстановочные знаки - они передаются программе как есть в ее командной строке или массиве argv. Поэтому каждая программа анализирует и расширяет их по-своему, и некоторые из более продвинутых вариантов использования (как вы ищете), как правило, не поддерживаются.

Предложение Тимгилберта об использовании Cygwin является хорошим, также в пакете GNUWin32 может быть что-то, что поможет вам.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.