DEV Community

Stefan Judis
Stefan Judis

Posted on • Originally published at stefanjudis.com on

TIL: How to use brace expansion ({}) to spread shell command arguments

Today I was reading a discussion about mv. The linked gist includes a shell custom function that wraps the mv command and adds functionality if the user only provides one argument.

# wrapped mv command which accepts edits to 
# the provided file path if only one argument was provided
mv planet.png
planet2.png
planet.png -> planet2.png
Enter fullscreen mode Exit fullscreen mode

It allows for editing the file path of provided first argument interactively. That is very neat by itself.

I went on a read the discussion about this command and learned that the mv command, or to make it clearer, bash/zsh make allow to rename a file with something that looks like a single command.

mv a/very/long/path/file.txt a/very/long/path/renamed.txt
Enter fullscreen mode Exit fullscreen mode

You can shorten the above command to the following:

mv a/very/long/path/{file,renamed}.txt
Enter fullscreen mode Exit fullscreen mode

Common shells will extract the {} pattern into its parts and create separate arguments.

mv a/very/long/path/{file,renamed}.txt
# ๐Ÿ‘† becomes ๐Ÿ‘‡
mv a/very/long/path/file.txt a/very/long/path/renamed.txt
Enter fullscreen mode Exit fullscreen mode

Another example is the creation of files that include indices.

touch {1..3}.txt
# ๐Ÿ‘† becomes ๐Ÿ‘‡
touch 1.txt 2.txt 3.txt
Enter fullscreen mode Exit fullscreen mode

Shell scripting. ๐Ÿ’™ There is always something new to learn.

Edited: Dominik pointed out that this shell feature is called brace expansion.

Top comments (0)