Re:Renaming files with mv without typing the name two times
by tzs on Monday April 13, 2020 @08:50PM
(#22861766)
Another common rename is the three way:
Nested {} can handle that one, cutting four 'file's down to one:
Anyone have a way to hack that to cut the two 'mv's down to one?
[ Parent
| on HN ]
Re:Renaming files with mv without typing the name two times
by TheDong on Monday April 13, 2020 @10:42PM
(#22862263)
> 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.
Re:Renaming files with mv without typing the name two times
by JadeNB on Monday April 13, 2020 @09:51PM
(#22862045)
I didn't know {} could nest!
Re:Renaming files with mv without typing the name two times
by CraneWorm on Tuesday April 14, 2020 @07:01AM
(#22864571)
It sorta can't... note the use of eval.
Re:Renaming files with mv without typing the name two times
by tzs on Tuesday April 14, 2020 @11:10AM
(#22866922)
The 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.
Re:Renaming files with mv without typing the name two times
by CraneWorm on Tuesday April 14, 2020 @05:11PM
(#22871503)
Sorry, 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.