I sometimes end up doing things like:
Example:
from ~/blah
$ mkdir ~/test-tmp
$ cp * ~/test-tmp
$ cd ~/test-tmp
using the destination dir 3 times in a row. Isn't there a way to turn these into a one-liner command?
I sometimes end up doing things like:
Example:
from ~/blah
$ mkdir ~/test-tmp
$ cp * ~/test-tmp
$ cd ~/test-tmp
using the destination dir 3 times in a row. Isn't there a way to turn these into a one-liner command?
You mean like this?
mkdir ~/test-tmp && cp * ~/test-tmp && cd ~/test-tmp
or
function mm() {
local dir=$1
if [ ! -z "$dir" ]
then
mkdir ~/${dir} && cp * ~/${dir} && cd ~/${dir}
fi
}
In bash, the argument to the last command you ran is saved as !$
. This is documented in man bash
:
! Start a history substitution, except when followed by a blank,
newline, carriage return, = or ( (when the extglob shell option
is enabled using the shopt builtin).
[...]
$ The last argument.
So, you could do
$ mkdir ~/test-tmp ; cp * !$ ; cd !$
Or, simply
$ mkdir ~/test-tmp
$ cp * !$
$ cd !$
If your concern includes the retyping of ~/test-tmp
, you can do the following to shorten and combine the commands into a one-liner:
D=~/test-tmp; mkdir $D; cp * $D; cd $D
Please note that if your path includes spaces, you have to quote the assignment and where you use the variable:
D="~/test tmp"; mkdir "$D" ; cp * "$D"; cd "$D"
A=1 echo $A
, when that did not work (because of the missing semi-colon and echo being build-in), I both added the export and the semi-colon in the next try
– Anthon
Jul 17 '14 at 14:33