How to Batch Rename Files in a macOS Terminal?

2020-01-27 09:39发布

I have a folder with a series of files named:

prefix_1234_567.png
prefix_abcd_efg.png

I'd like to batch remove one underscore and the middle content so the output would be:

prefix_567.png
prefix_efg.png

Relevant but not completely explanatory:

7条回答
地球回转人心会变
2楼-- · 2020-01-27 09:43

you can install rename command by using brew. just do brew install rename and use it.

查看更多
冷血范
3楼-- · 2020-01-27 09:47

In your specific case you can use the following bash command (bash is the default shell on macOS):

for f in *.png; do echo mv "$f" "${f/_*_/_}"; done

Note: If there's a chance that your filenames start with -, place -- before them[1]:
mv -- "$f" "${f/_*_/_}"

Note: echo is prepended to mv so as to perform a dry run. Remove it to perform actual renaming.

You can run it from the command line or use it in a script.

  • "${f/_*_/_}" is an application of bash parameter expansion: the (first) substring matching pattern _*_ is replaced with literal _, effectively cutting the middle token from the name.
  • Note that _*_ is a pattern (a wildcard expression, as also used for globbing), not a regular expression (to learn about patterns, run man bash and search for Pattern Matching).

If you find yourself batch-renaming files frequently, consider installing a specialized tool such as the Perl-based rename utility. On macOS you can install it using popular package manager Homebrew as follows:

brew install rename

Here's the equivalent of the command at the top using rename:

rename -n -e 's/_.*_/_/'  *.png

Again, this command performs a dry run; remove -n to perform actual renaming.

  • Similar to the bash solution, s/.../.../ performs text substitution, but - unlike in bash - true regular expressions are used.

[1] The purpose of special argument --, which is supported by most utilities, is to signal that subsequent arguments should be treated as operands (values), even if they look like options due to starting with -, as Jacob C. notes.

查看更多
迷人小祖宗
4楼-- · 2020-01-27 09:52

To rename files, you can use the rename utility:

brew install rename

For example, to change a search string in all filenames in current directory:

rename -nvs searchword replaceword *

Remove the 'n' parameter to apply the changes.

More info: man rename

查看更多
Anthone
5楼-- · 2020-01-27 10:00

I had a batch of files that looked like this: be90-01.png and needed to change the dash to underscore. I used this, which worked well:

for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done
查看更多
beautiful°
6楼-- · 2020-01-27 10:02

try this

for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done

Here is another way:

for file in Name*.png; do mv "$file" "01_$file"; done
查看更多
祖国的老花朵
7楼-- · 2020-01-27 10:03

Using mmv

mmv '*_*_*' '#1_#3' *.png
查看更多
登录 后发表回答