Короткий ответ
Чтобы отобразить имена файлов PDF, прямо или косвенно содержащихся в прямом или косвенном подкаталоге d:\root
named purchases
, вы можете использовать:
gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | % FullName
Краткое объяснение: команда рекурсивно находит все прямые и косвенные подкаталоги d:\root
named purchases
, затем рекурсивно находит все файлы PDF в каждом из этих подкаталогов, а затем возвращает полный путь каждого из этих файлов PDF.
Другие варианты использования
Чтобы удалить эти файлы PDF:
gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | ri
Чтобы переименовать эти PDF-файлы (например, добавив префикс и суффикс к базовому имени):
gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | % { rni $_ "pref-$($_.BaseName)-suff.pdf" }
Чтобы удалить purchases
каталоги вместе со всем их содержимым:
gci -Directory -Recurse d:\root\purchases | ri -Recurse
Детальное объяснение
gci
псевдоним для Get-ChildItem .gci -Directory -Recurse d:\root\purchases
возвращает все каталоги (-Directory
), чьи именаpurchases
являются прямыми или косвенными (-Recurse
) вложенными папкамиd:\root\
. Другими словами, он вернетсяd:\root\purchases
(если он существует) так же, какd:\root\b\c\purchases
иd:\root\a\purchases
. Это не очень интуитивно понятно и, по-видимому, не объясняется в документации, но это текущее поведение (в PowerShell 6).%
является псевдонимом для ForEach-Object . Он выполняет блок скрипта (заключенный в фигурные скобки ({}
) для каждого объекта в конвейере).gci -Recurse "$_\*.pdf"
извлекает список файлов PDF, которые (прямо или косвенно) содержатся в ранее найденныхpurchases
каталогах.% FullName
просто используется для отображения пути этих файлов PDF.ri
является псевдонимом для Remove-Item . Он удаляет ранее вычисленный список файлов PDF (поскольку-Path
параметрRemove-Item
команды принимает входные данные конвейера).ri -Recurse
позволяет удалить ранее вычисленный списокpurchases
каталогов вместе с их содержимым.rni $_ "pref-$($_.BaseName)-suff.pdf"
добавляет префикс (pref-
) и суффикс (-suff
) к базовому имени$_.BaseName
текущего файла в конвейере (т. е. каждого из файлов PDF, которые мы ищем). Базовое имя файла - это имя файла без его расширения иrni
псевдоним для Rename-Item .
Тестирование этого решения (онлайн или локально)
Самое простое - попробовать это решение онлайн .
В противном случае вы можете создать образец структуры каталогов в test
папке текущего рабочего каталога со следующим фрагментом ( будьте осторожны : измените .\test
на что-то другое, если у вас уже есть test
папка в текущем каталоге):
mkdir -ErrorAction SilentlyContinue .\test\a\purchases, .\test\a\e\, .\test\b\c\purchases\ Out-File .\test\a\purchases\invoice1.pdf Out-File .\test\a\order1.pdf Out-File .\test\a\e\order2.pdf Out-File .\test\b\c\purchases\invoice2.pdf Out-File .\test\b\c\purchases\invoice3.pdf
Чтобы просмотреть все файлы в этой структуре каталогов, вы можете использовать:
gci -Recurse -File .\test | % FullName
Что бы вернуть что-то вроде:
D:\test\a\order1.pdf D:\test\a\e\order2.pdf D:\test\a\purchases\prefix-invoice1-suffix.pdf D:\test\b\c\purchases\prefix-invoice2-suffix.pdf D:\test\b\c\purchases\prefix-invoice3-suffix.pdf
(Где D:
заменяется вашим текущим рабочим каталогом.)
Выполнение команды, предоставленной в качестве ответа ( gci -Directory -Recurse .\test\purchases | % { gci -Recurse "$_\*.pdf" } | % FullName
), отобразит файлы, которые необходимо удалить или удалить:
D:\test\a\purchases\invoice1.pdf D:\test\b\c\purchases\invoice2.pdf D:\test\b\c\purchases\invoice3.pdf
Чтобы очистить после вашего теста:
rm -Recurse .\test