I sometimes end up doing things like:


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


function mm() {
  local dir=$1
  if [ ! -z "$dir" ]
    mkdir ~/${dir} && cp * ~/${dir} && cd ~/${dir}

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"
  • nice one! although the export isn't required in this case. – fduff Jul 17 '14 at 14:20
  • @fduff You are right. From my bash history I see I first tried 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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.