PowerShell: Перейменування / видалення файлів у папці, яка може з'являтися в різних місцях у ієрархії файлів


1

Наразі намагається визначити спосіб перейменування файлів PDF у певній папці ( /root ) безпосередньо або опосередковано всередині a purchases папка, яка є безпосередньо або опосередковано всередині /root папки. Я хотів би досягти цього за допомогою PowerShell, але не можу досягти більше, ніж приклади, знайдені на численних темах.

Наприклад, з цією структурою каталогу:

/root/<subfolder1>/purchases/invoice1.pdf
/root/<subfolder1>/order.pdf
/root/<subfolder2>/purchases/invoice2.pdf

Намір полягає в тому, щоб перейменовувати або видаляти файли PDF, що знаходяться в папках "покупки". Не слід торкатися файлів PDF у будь-якій іншій папці.

The <subfolderX> імена невідомі (тобто вони можуть бути будь-якими, наприклад, "a" або "b").

Сценарій повинен рекурсивно виконувати всі папки.

Будь-яке керівництво для досягнення цього було б оцінено.


1
замість того, щоб робити два gci дзвінки, як пропонують інші відповіді, можна просто зробити це: gci C:\Root *.pdf -Recurse | ? DirectoryName -imatch 'purchase' це поверне тільки PDF-файли, які мають рядок purchase будь-де у назві каталогу (шляху)
SimonS

Ви маєте рацію @SimonS! Можна використовувати gci -Recurse \root\*.pdf | ? { $_.DirectoryName -imatch '.*\\purchases(\\.*|$)' } | % FullName замість моєї відповіді, але це не обов'язково швидше (залежно від точної файлової структури), оскільки не використовує можливості фільтрування постачальника файлової системи PowerShell (тобто ефективну підтримку глобалізації).
Youssef Abidi

Відповіді:


2

Коротка відповідь

Для відображення назв PDF-файлів прямо або побічно міститься в прямому або непрямому підкаталозі d:\root ім purchasesВи можете використовувати:

gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | % FullName

Коротке пояснення: команда рекурсивно знаходить всі прямі та непрямі підкаталоги d:\root ім 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).
  • % є псевдонімом для Длякожного об'єкта . Він виконує блок сценаріїв (укладений у фігурні фігурні дужки ( {} ) для кожного об'єкта в трубопроводі.
  • gci -Recurse "$_\*.pdf" отримує список PDF-файлів, які (прямо чи опосередковано) містяться в раніше знайдених файлах purchases каталоги.
  • % FullName використовується для відображення шляху цих файлів PDF.
  • ri є псевдонімом для Видалити-елемент . Він видаляє раніше обчислений список PDF-файлів (оскільки -Path параметр Remove-Item команда приймає вхід трубопроводу).
  • ri -Recurse дозволяє видалити попередньо обчислений список purchases каталоги разом зі своїм вмістом.
  • rni $_ "pref-$($_.BaseName)-suff.pdf" додає префікс ( pref- ) і суфікс ( -suff ) до базової назви $_.BaseName поточного файлу в конвеєрі (тобто кожного з файлів PDF, які ми шукаємо). Базовою назвою файлу є ім'я файлу без його розширення і rni є псевдонімом для Перейменувати-елемент .

Тестування цього рішення (онлайн або локально)

Найпростіше спробуйте це рішення в Інтернеті .

В іншому випадку можна створити зразкову структуру каталогів в a test папки поточного робочого каталогу , з наступним фрагментом ( будь обережний : change .\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

1

Youssef Abidi дав вам відповідь на один диск, але здається, що ви говорите, що шлях до папки до.

Тим не менш, правило форуму полягає в тому, що ви повинні надати те, що ви пробували, і помилки, з якими ви зіткнулися, так що ви показуєте, що ви закінчуєте мету, проти того, щоб ми здогадалися, і як більшість сказав би, що "зробите вашу роботу за вас". Люди тут дуже корисні, але, знаєте.

Все сказане, якщо моє припущення правильне. По суті, зробіть фільтр для папки покупок на будь-якому диску на хості, а потім PDF в цій папці і зробіть, як вам захочеться.

Насправді це лише одна конвеєрна команда - якщо вищенаведене є допустимим припущенням

(Get-PSDrive).Root -like '*:\' | 
% { (Get-ChildItem -Path ((Get-ChildItem -Path $_ -recurse -Filter Purchases -Directory -ErrorAction SilentlyContinue).FullName) -Filter '*.pdf' -Verbose).FullName }

# Results

C:\purchases\powershell-cheat-sheet.pdf
C:\purchases\PSPunctuationWallChart_1_0_4.pdf
D:\Temp\purchases\powershell-cheat-sheet.pdf
D:\Temp\purchases\PSPunctuationWallChart_1_0_4.pdf

Звичайно, ви можете розбити цей лайнер на щось інше.


0

Я погоджуюся робити домашнє завдання дуже важливо для спільноти. Я зрозумів, як багато з gci і фільтром, але не міг імпровізувати частину подвійних gci між цитатами.

Буду робити все можливе для мого наступного питання, щоб показати деякі зусилля. Незважаючи на те, що ваші відповіді допомогли мені вирішити цю проблему.

Так ще раз велике спасибі!


Не хвилюйтеся, ми зробили щось подібне в нашій кар'єрі і в одній точці. Переконайтеся, що вибрали одну чи іншу, як ви прийняли відповідь на користь інших, які мають подібні запити і зустрічаєте цю. Будьте обережні та щасливі сценарії.
postanote
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.