It is common to use a for-loop with glob patterns:
for i in *.txt; do mv $i $i.old done
But if the glob pattern does not match anything it will be preserved unchanged in the command. This results in command execution of mv *.txt *.txt.old
which fails because no file named *.txt
(literally!) exists.
As this is not the desired behavior, here is a way how to do this as expected without forking using the nullglob
bash shell option.
oldnullglob=$(shopt -p nullglob) shopt -s nullglob for i in *.txt; do mv $i $i.old done eval "$oldnullglob" 2>/dev/null unset oldnullglob
This will silently prevent the execution of the mv
command. If you use failglob
instead of nullglob
bash will interrupt the evaluation of any command if the glob pattern did not match anything.
Disclaimer: Be careful with this option, as this will not be the expected behavior in all cases. Most (in)famously it breaks bash-completion
if you set it in your interactive bash session. I suggest to use it temporary only.