Shell/Bash shortcut for bulk renaming of files in a folder Shell/Bash shortcut for bulk renaming of files in a folder linux linux

Shell/Bash shortcut for bulk renaming of files in a folder


I would suggest something like this:

for i in *-doc-*.txt; do mv "$i" "${i/*-doc-/doc-}"; done

${i/*-doc-/doc-} replaces the first occurrence of *-doc- with doc-.

If you need to do more than one replacement (see comment number 1), you need to use the ${var//Pattern/Replacement} variant. If you need to replace the beginning of the name you need to use ${var/#Pattern/Replacement}, if you need to replace the end (ie: the extension) you need to use the ${var/%Pattern/Replacement} form.

See Shell Parameter Expansion for more details. This expansion is bash specific.


If you have rename then, rename 's/^.*-doc-/doc-/' *.txt should do the trick.


There is prename, that allows you to use REGEX:

prename 's/^.*-doc-(.*\.txt)$/doc-$1/'  *.txt

Use the option -n to simulate:

prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/'  *.txt

Note: This is the shipped as rename in many Linux distributions, but not in all of them -- so I'm using the canonical name for the utility that comes with Perl.