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
    The filename, directory name, or volume label syntax is incorrect.

    > dir *\*\*
    The filename, directory name, or volume label syntax is incorrect.

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

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

6 ответов6

13

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


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

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

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

7

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

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

2

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

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

2

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

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. Символ @ позволяет избежать вывода команд на экран.

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

0

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

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

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