Skip to content
Advertisement

Recursively change file name in folder and subfolders without changing file path

I have files in a format like 639486572_016b0f3d-9ec3-4ad1-84ae-c98b68390322.wav. The files reside in a folder and sub-folder format that resembles a date. ./2019/05/31/639486572_016b0f3d-9ec3-4ad1-84ae-c98b68390322.wav.

The goal is to remove everything before and including the _. Which im able to do with rename -v 's/$.+_//'

But when I try to couple this with find it seems to rename all the files found in the subfolder correctly but placesmoves them to the root of the folder im working out of so in this case ./2019

The command im running is find -type f -name "*_*" | rename -v 's/$.+_//'

How can I ensure the files location doesn’t change ?

Advertisement

Answer

$ will be undefined and will do nothing in your regular expression.

.+_ will match everything from the beginning of a string to the last _ character, including the path information. You’ll want to use a more restrictive expression that won’t capture the whole path.

There are a few ways you can do it:

s![^/]+_!!        greedy match of consecutive non-/ chars

s!(.+/)?.+_!$1!   capture path and include it in the replacement

There is also a solution that would use a negative look-behind assertion, when you are ready to open that can of worms.

User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement