Resposta curta
Para exibir os nomes dos arquivos PDF direta ou indiretamente contidos em um subdiretório direto ou indireto de d:\root denominado purchases , você pode usar:
gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | % FullName
Breve explicação: o comando recursivamente localiza todos os subdiretórios diretos e indiretos de d:\root denominado purchases , depois recursivamente localiza todos os arquivos PDF em cada um desses subdiretórios e retorna o caminho completo de cada um desses arquivos PDF.
Outros casos de uso
Para remover esses arquivos PDF:
gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | ri
Para renomear esses arquivos PDF (por exemplo, adicionando um prefixo e um sufixo ao nome base):
gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | % { rni $_ "pref-$($_.BaseName)-suff.pdf" }
Para remover os diretórios purchases juntamente com todo o conteúdo:
gci -Directory -Recurse d:\root\purchases | ri -Recurse
Explicação detalhada
-
gcié um alias para Get-ChildItem . -
gci -Directory -Recurse d:\root\purchasesretorna todos os diretórios (-Directory) cujo nome épurchasesque são subpastas diretas ou indiretas (-Recurse) ded:\root\. Em outras palavras, ele retornariad:\root\purchases(se existisse), bem comod:\root\b\c\purchasesed:\root\a\purchases. Isso não é muito intuitivo e não parece ser explicado no documentação , mas é o comportamento atual (a partir do PowerShell 6). -
%é um alias para ForEach-Object . Ele executa um bloco de script (entre chaves ({}) para cada objeto no pipeline. -
gci -Recurse "$_\*.pdf"recupera a lista de arquivos PDF que estão (direta ou indiretamente) contidos nos diretóriospurchasesencontrados anteriormente. -
% FullNameé usado apenas para exibir o caminho desses arquivos PDF. -
rié um alias para Remove-Item . Ele remove a lista de arquivos PDF anteriormente calculada (porque o parâmetro-Pathdo comandoRemove-Itemaceita entrada de pipeline). -
ri -Recursepermite remover a lista de diretóriospurchasesanteriormente computados, juntamente com o conteúdo deles. -
rni $_ "pref-$($_.BaseName)-suff.pdf"adiciona um prefixo (pref-) e um sufixo (-suff) ao nome base$_.BaseNamedo arquivo atual no pipeline (por exemplo, cada um dos arquivos PDF que estamos procurando). O nome base de um arquivo é o nome do arquivo sem sua extensão ernié um alias para Renomear-Item .
Testando esta solução (online ou localmente)
O mais fácil é para tentar esta solução online .
Caso contrário, você pode criar uma estrutura de diretório de exemplo em uma test pasta do diretório de trabalho atual , com o seguinte trecho ( tenha cuidado : altere .\test para outra coisa se você já tiver uma pasta test no diretório atual):
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
Para visualizar todos os arquivos nessa estrutura de diretório, você pode usar:
gci -Recurse -File .\test | % FullName
Qual seria o retorno de algo como:
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
(Onde D: é substituído pelo seu diretório de trabalho atual.)
Executar o comando fornecido como resposta ( gci -Directory -Recurse .\test\purchases | % { gci -Recurse "$_\*.pdf" } | % FullName ) exibirá os arquivos que precisam ser removidos ou excluídos:
D:\test\a\purchases\invoice1.pdf
D:\test\b\c\purchases\invoice2.pdf
D:\test\b\c\purchases\invoice3.pdf
Para limpar após o seu teste:
rm -Recurse .\test