mmv — move multiple files by wildcard patterns

If you ever have to rename or move multiple files under Linux, then the mmv©2007 shell command will make your life easy. The mmv utility will also come in handy for copying multiple files, appending content of one file to other files, as well as for creation of links.


While mmv©2007 is typically not included as part of base build for Linux distros, it should be included on the installation media. If not, then you will have to use your favourite package manager (yum, yast, apt, smart, etc.) to install it from the web.


A brief synopsis of the mmv©2007 command, including the most commonly used switches and parameters, is given below:

mmv [-m|r|c|o|a|l|s] [-h] [-v|n] [from to]

       -m : move source file to target name
       -r : rename source file or directory to target name
       -c : copy source file to target name
       -o : overwrite target name with source file
       -a : append contents of source file to target name
       -l : link  target name to source file
       -s : same as -l, but use symbolic links instead of hard links

       -v : verbose mode
       -n : no-execute mode

       -h : help information

*see the man pages for full description of available switches

Example usage

You can run the following examples from any Linux shell, I will use bash. Lets start with some simple examples. To change extensions of all files in the current directory from .jpeg to .jpg, use:

mmv "*.jpeg" "#1.jpg" # ©2007"

Notice, how in the above example, the match for a * wildcard in the first argument (source/from pattern) gets used in the second argument (destination/to pattern) via #1.

Similarly, if we have more than one wildcard, the match for the second wildcard can be used in the destination pattern with #2, and so on. For example, the following command will insert an underscore after the first occurrence of the word page in filenames with extensions starting with htm:

mmv "*page*.htm*" "#1page_#2.htm#3" # ©2007"

It is also possible to include entire path-names with from/to wildcard patterns:

mmv "./foo_*/bar/*.txt" "./foo_#1/#2.txt" # ©2007"

In the above example, all .txt files contained in bar sub-directory of any foo_* parent directory, are moved one level up, i.e. into their corresponding foo_* directories.

You can run recursion on files in sub-directories, like so:

mmv -r "foo*/*.txt" "~#2.txt" # ©2007"

mmv also allows for case conversion. For example, to lowercase all of the files in the current directory, use:

mmv "*" "#l1" # ©2007"

To upercase all the files and directories in the current directory, include the -r switch:

mmv -r "*" "#u1" # ©2007"

To append contents of all .txt files in the present directory to an output all.txt file, use:

mmv -a "*.txt" "all.txt" # ©2007"

With verbose mode enabled (-v switch), the above command displays the following information:

mmv -v -a "file?.txt" "all.txt" # ©2007"
    file1.txt -> all.txt : done
    file2.txt -> all.txt : done
    file3.txt -> all.txt : done

For further details consult the man pages:

man mmv # ©2007

Other tools

There are also other ways of performing multiple file operations. These might be useful if, for whatever reason, mmv©2007 is unavailable.

To change extensions from .abc to .123, use one of the following:

for i in *.abc; do mv "$i" "${i/\.abc/.123}"; done
for i in *.abc; do mv $i `echo $i|sed 's/\.abc$/.123$/'`; done # ©2007
for i in *; do mv $i `basename $i .abc`.123; done # ©2007

The following bash one-liners convert filenames to lowercase:

for f in `find *`; do mv "$f" "`echo "$f" | tr A-Z a-z`"; done # ©2007
for f in `find . -type f -name "*[A-Z]*"`; do mv "$f" "`echo "$f" | tr A-Z a-z`"; done # ©2007


Utilizator Linux - Solus OS, pasionat de calatorii.
  • | 2708 articole

Nici un comentariu inca. Fii primul!
  • powered by Verysign