Como posso criar um diretório e alterar meu diretório de trabalho para o novo diretório?

18

Estou procurando uma maneira de criar um diretório e alterar meu diretório de trabalho atual para um diretório recém-criado usando apenas um único comando. Como posso fazer isso?

ou seja, em vez de fazer

user@Computer:~$ mkdir NewDirectory
user@Computer:~$ cd NewDirectory
user@Computer:~/NewDirectory$ 

eu quero fazer

user@computer:~$ **command** NewDirectory
user@Computer:~/NewDirectory$

Qual pode ser o comando ?

TheKojuEffect
fonte

Respostas:

27

Se você realmente deseja que seja apenas um comando, sugiro adicionar algo assim ao seu .bashrc:

md () { mkdir -p "$@" && cd "$1"; }

Entrar md foona linha de comando criará um diretório chamado fooe cdnele imediatamente depois. Lembre-se de que você precisará recarregar o seu .bashrcpara que as alterações entrem em vigor (por exemplo, abra um novo console ou execute source ~/.bashrc).

Cf. http://www.commandlinefu.com/commands/view/3613/create-a-directory-and-change-into-it-at-the-same-time também para possíveis alternativas.

Michael Biech
fonte
19

mkdir "NewDirectory" && cd "NewDirectory"

  • A parte por trás do &&será executada apenas se o 1º comando for bem-sucedido.
  • É chamado de Listas de comandos no manual do Bash.
  • Há também uma versão abreviada:

    mkdir "NewDirectory" && cd "$_"
    
  • Exemplo da linha de comando:

    $ false && echo "yes"
    $ true && echo "yes"
    yes
    
  • (editar) Adicionar "aos comandos, pois o diretório pode conter um espaço.

Rinzwind
fonte
mkdir "NewDir" && cd "$_"funciona muito bem do mkdir "NewDir" && cd "NewDir"que o preenchimento automático não funciona. Aliás, o que é "$ _"?
TheKojuEffect
Mais do que isso, seria bastante útil se pudéssemos anexar uma opção mkdirpara mudar para o novo diretório criado.
TheKojuEffect
@TheKojuEffect $ _ see gnu.org/software/bash/manual/bashref.html#Lists Com relação ao último: ninguém está impedindo você de usar um alias ou uma função dentro .bashrc;)
Rinzwind
7

Não há função interna para isso, mas você pode usar a funcionalidade do shell para ajudar a não precisar digitar o argumento do cdcomando novamente após a execução mkdir:

  • Digite cd , então Esc .(ou Alt+ .) para inserir o último argumento do comando anterior.
  • cd !$executa cdno último argumento do comando anterior.
  • Imprensa Upde recordar a linha de comando anterior, em seguida, editá-lo para mudar mkdirpara cd.

Você pode definir uma função simples de criar e alterar diretório em ~/.bashrc:

mkcd () { mkdir "$1" && cd "$1"; }

Recarregue seu .bashrc( . ~/.bashrc) ou reinicie o bash e agora você pode digitar mkcd new-directory.

Essa versão simples falha em alguns casos incomuns, envolvendo nomes de diretórios estranhos ou ..links simbólicos. Aqui está um que faz. Para explicações, consulte a versão Unix e Linux desta pergunta .

mkcd () {
  case "$1" in
    /*) mkdir -p "$1" && cd "$1";;
    */../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "$1";;
    ../*) (cd .. && mkdir -p "${1#.}") && cd "$1";;
    *) mkdir -p "./$1" && cd "./$1";;
  esac
}
Gilles 'SO- parar de ser mau'
fonte
Meu +1 é especificamente para as referências específicas do Bash aos argumentos do último comando.
0xC0000022L
+1 para excesso de engenharia. Excelsior! :)
mhvelplund
3
mkdir -p "as/many dirs/as you/want" && cd "$_"

existe uma solução listada acima (igual à minha solução, mas sem a opção -p), mas acho que tem algumas armadilhas.

man mkdir
...
-p, --parents
       no error if existing, make parent directories as needed
...

Isso nos dá dois benefícios:

  1. Podemos criar quantos subdiretórios forem necessários de uma só vez
  2. Se o diretório existir, ele não emitirá um erro e ainda poderemos mudar para o diretório existente.

&& cd "$_"mudará para o diretório recém-criado, pois $_hold o valor retornado mymkdir

thebugfinder
fonte
Isso funciona para mim
alhelal