jordan.baucke
jordan.baucke

Reputation: 4328

Windows power shell script to rename all files in each directory to parent's name

I'm working on learning Windows PS - but until than I need some help writing a quick command:

I have a directory of directories, each directory has a unique name.

I need to rename all files within each of these directories to their parents name! As follows:

Current Structure:

/pdfdirectory/pdf_title_directory/filename.pdf
/pdfdirectory/pdf_title_directory123/filename.pdf

After shell script:

/pdfdirectory/pdf_title_directory/pdf_title_directory.pdf
/pdfdirectory/pdf_title_directory123/pdf_title_directory123.pdf

Thanks!

Upvotes: 0

Views: 1121

Answers (2)

OldFart
OldFart

Reputation: 2479

It's worth noting that you can pipe the output from Get-ChildItem directly into Rename-Item, you don't need a foreach. Also, and this is the clever part, the -NewName parameter value can be a script block that yields the new name. This script block can use $_ to refer to the file object that is currently being processed.

So you could do something like this:

dir -Recurse -Include filename.pdf | ren -NewName { "$($_.Directory.Name).pdf" }

(I think it was Keith Hill that made me aware of this trick.)

Upvotes: 1

manojlds
manojlds

Reputation: 301147

With good faith that you are learning Powershell and will try out stuff:

gci .\test -recurse | ?{ -not $_.PsIsContainer } | 
%{rename-item -path $_.fullname -newname ($_.Directory.Name + $_.Extension)}

Of course, the above will fail it there is more than one file in the directory.

To understand the above learn basic Powershell commands like gci ( alias for Get-ChildItem) and Powershell pipeline concepts.

Upvotes: 5

Related Questions