4 ms·
This is a technique I use often: mv file.name{,.bak} cp process.log{,.old} etc.
by sigwinch28 7y ago
This is a technique I use often:
mv file.name{,.bak}
cp process.log{,.old}
etc.
- IngoBlechschmid 7y agoAn alternative is: mv file.name !#:1.bak cp process.log !#:1.old !#:1 expands to the word with index 1.
- kesor 7y agoAnd it supports regex replace as well $ echo foobar !#:1:s/foo/bar echo foobar barbar foobar barbar
- garryq 7y agoslightly shorter !#$ and i always use ctrl-alt-e to expand and check even if i dont want to edit
- Anthony-G 7y agoI didn't know about the Ctrl-Alt-E so that's useful to know when using a new computer or a shared user account. I have `shopt -s histverify` set in my own bashrc. It's a useful sanity check when using history expansion. After typing the command, press Enter to see what it expands to, verify that it's what I intend and hit Enter a second time to confirm the comand.
- tzs 7y agoAnother common rename is the three way: mv file file.bak; mv file.new file Nested {} can handle that one, cutting four 'file's down to one: eval mv file{,{.bak\;mv\ ,.new},} Anyone have a way to hack that to cut the two 'mv's down to one?
- JadeNB 7y agoI didn't know {} could nest!
- CraneWorm 7y agoIt sorta can't... note the use of eval.
- tzs 7y agoThe eval isn't to help with the nesting. The {} stuff nests just fine, as we can see by changing the "eval mv" to printf: $ printf '[%s]' file{,{.bak\;mv,.new},} [file][file.bak;mv][file.new][file] (Note: I took out the '\ ' from the original because I realized it is not necessary). The eval is there because in bash text expansion occurs after ';' is interpreted, and we need that to be the other way around. Hence, the escaping of ';' in the input to preserve it for text expansion, and then the eval afterward to get ';' interpreted.
- CraneWorm 7y agoSorry, I should have checked. I jumped at it because there are other things one might like to achieve with brace expansion but turn out to be impossible because it is evaluated first - you can't use them with variables.
- TheDong 7y ago> Anyone have a way to hack that to cut the two 'mv's down to one? Yup: mv -bS .bak file{.new,} Should give the same result if you're using gnu coreutils 'mv', though it's obviously not as generally useful as nested braces.