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\purchases
retorna todos os diretórios (-Directory
) cujo nome épurchases
que são subpastas diretas ou indiretas (-Recurse
) ded:\root\
. Em outras palavras, ele retornariad:\root\purchases
(se existisse), bem comod:\root\b\c\purchases
ed:\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óriospurchases
encontrados 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-Path
do comandoRemove-Item
aceita entrada de pipeline). -
ri -Recurse
permite remover a lista de diretóriospurchases
anteriormente computados, juntamente com o conteúdo deles. -
rni $_ "pref-$($_.BaseName)-suff.pdf"
adiciona um prefixo (pref-
) e um sufixo (-suff
) ao nome base$_.BaseName
do 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