Simd
Simd

Reputation: 21244

How to rename a lot of files

I have directory of files called:

foo--ext1
foo--ext2
foo--ext3
...

I would like to rename them to:

foo-bar-ext1
foo-bar-ext2
foo-bar-ext3
....

How can I do this renaming in bash?

I have attempted to understand mywiki.wooledge.org/BashFAQ/030 but I can't work what should go in place of ${f%.foo}.bar"; in the first example.

So I have started with:

for f in foo--*; do echo mv -- "$f" 

but what do I put next?

Upvotes: 0

Views: 123

Answers (2)

Paul Hodges
Paul Hodges

Reputation: 15246

There are several ways to approach this.
I recommend bookmarking this page and referencing it often.

I would use this:

$: for f in foo--*; do mv "$f" "${f//foo--/foo-bar-}"; done

This uses string substitution in the current filename to construct the new name, replacing foo-- with foo-bar-.

Note the // in the replacement. This will replace every occurrence of foo-- with foo-bar- in each filename.

$: ls -l foo-*
-rw-r--r-- 1 paul 1049089 0 Jul 26 14:32 foo-bar-ext1
-rw-r--r-- 1 paul 1049089 0 Jul 26 14:32 foo-bar-ext2
-rw-r--r-- 1 paul 1049089 0 Jul 26 14:32 foo-bar-ext3
-rw-r--r-- 1 paul 1049089 0 Jul 26 14:33 foo-bar-foo-bar-etx4

Remove one of the leading slashes to make it only handle the first occurrence -

$: for f in foo--*; do mv "$f" "${f/foo--/foo-bar-}"; done
$: ls -l foo-*
-rw-r--r-- 1 paul 1049089 0 Jul 26 14:34 foo-bar-ext1
-rw-r--r-- 1 paul 1049089 0 Jul 26 14:34 foo-bar-ext2
-rw-r--r-- 1 paul 1049089 0 Jul 26 14:34 foo-bar-ext3
-rw-r--r-- 1 paul 1049089 0 Jul 26 14:34 foo-bar-foo--ext4

Upvotes: 3

David C. Rankin
David C. Rankin

Reputation: 84521

Another simple method avoiding the loop is to use rename (from the util-linux package). There all that is needed is:

rename "foo-" "foo-bar" foo--*

You can check what will be done before actually doing the rename with the -n (no-act) and -v (verbose) options. For your example files, that would be:

$ rename -nv "foo-" "foo-bar" foo--*
`foo--ext1' -> `foo-bar-ext1'
`foo--ext2' -> `foo-bar-ext2'
`foo--ext3' -> `foo-bar-ext3'

There are two versions of rename that you will find provided in Linux distributions, the rename above from the util-linux package and perl-rename, which some Linux distros use instead which will also install as rename. Both are capable of handling the rename, but the options will be different. Check which you have with rename --version before use.

Upvotes: 1

Related Questions