1

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 places\moves 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 ?

1 Answers1

0

$\ 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.

mob
  • 110,546
  • 17
  • 138
  • 265
  • I went `s!(.+/)?.+_!$1!` would you recommend a site that helps better understands the expressions? Its something I definitely need to read on. Most of the stuff I found were very basic expressions. – Murda Ralph Jan 23 '20 at 15:54
  • @MurdaRalph See https://stackoverflow.com/questions/22937618/reference-what-does-this-regex-mean – Grinnz Jan 23 '20 at 16:06
  • @Grinnz this is perfect. – Murda Ralph Jan 23 '20 at 16:20