How to use brace expansion ({}) to spread shell command arguments
- Published at
- Updated at
- Reading time
- 1min
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
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
You can shorten the above command to the following:
mv a/very/long/path/{file,renamed}.txt
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
Another example is the creation of files that include indices.
touch {1..3}.txt
# ๐ becomes ๐
touch 1.txt 2.txt 3.txt
Shell scripting. ๐ There is always something new to learn.
Edited: Dominik pointed out that this shell feature is called brace expansion.
Join 5.4k readers and learn something new every week with Web Weekly.