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.