Powershell: несколько подстановочных знаков в пути Get-ChildItem - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь использовать Get-ChildItem в powershell (я использую псевдоним ls), чтобы возвращать только файлы в указанной структуре папок c.

В качестве примера, скажем, я Я пытаюсь перечислить все файлы, имена которых заканчиваются на .foobar.txt, которые находятся в папке с именем src, которая, в свою очередь, находится в папке с именем even. Я пытался использовать команду ls -r *\even\src\*.foobar.txt | % FullName. Я думал, что первый подстановочный знак * в пути разрешит любой путь, заканчивающийся \even\src\, и что второй будет соответствовать только файлам, оканчивающимся на .foobar.txt. Но он не возвращает все файлы, которые я ожидаю. Вот структура каталога, в котором я тестирую:

root
|- project1
|  |- odd
|     |- src
|     |  |- a.foobar.txt
|     |  |- b.foobar.txt
|     |  |- c.snafu.txt
|     |
|     |- temp
|        |- a.foobar.txt
|        |- b.foobar.txt
|        |- c.snafu.txt
|
|- project2
|  |- folder1
|     |- folder2
|        |- folder3
|           |- folder4
|              |- even
|                 |- src
|                 |  |- a.foobar.txt
|                 |  |- b.foobar.txt
|                 |  |- c.snafu.txt
|                 |
|                 |- temp
|                    |- a.foobar.txt
|                    |- b.foobar.txt
|                    |- c.snafu.txt
|
|- project3
|  |- odd
|     |- src
|     |  |- a.foobar.txt
|     |  |- b.foobar.txt
|     |  |- c.snafu.txt
|     |
|     |- temp
|        |- a.foobar.txt
|        |- b.foobar.txt
|        |- c.snafu.txt
|
|- project4
   |- even
      |- src
      |  |- a.foobar.txt
      |  |- b.foobar.txt
      |  |- c.snafu.txt
      |
      |- temp
         |- a.foobar.txt
         |- b.foobar.txt
         |- c.snafu.txt

Вывод команды выше

root\project4\even\src\a.foobar.txt
root\project4\even\src\b.foobar.txt

Однако я ожидал

root\project2\folder1\folder2\folder3\folder4\even\src\a.foobar.txt
root\project2\folder1\folder2\folder3\folder4\even\src\b.foobar.txt
root\project4\even\src\a.foobar.txt
root\project4\even\src\b.foobar.txt

Как изменить команду, чтобы она также находила файлы в папке project2?

Ответы [ 2 ]

1 голос
/ 21 января 2020

Думал о совпадении строк:

gci * -R | ? { $_.FullName -like '*\even\src\*.foobar.txt' }

1 голос
/ 21 января 2020

Разбейте его на 2 шага. Сначала извлеките все каталоги, отфильтровав те, которые вам нужны, затем передайте результат, полученный через другой get-childitem, который отфильтровывает нужные вам имена файлов:

ls -Recurse -Directory | where {$_.FullName -like "*\even\src"} | ls -filter  *.foobar.txt 
...