Crie um novo comando do Mac Terminal para copiar a pasta

Crie um novo comando do Mac Terminal para copiar a pasta

Como posso criar um novo comando de terminal que copie uma pasta (será sempre a mesma pasta) e seu conteúdo para o diretório atual (se nenhum caminho for fornecido) ou para o caminho fornecido.

Este comando deve assumir os seguintes parâmetros:

  1. Nome da nova pasta para onde copiar o conteúdo (ou seja mkdir myNewFolder)
  2. O caminho do diretório no qual criar a nova pasta e colar o conteúdo.

Eu gostaria de terminar com algo assim:

$ createsite newFolderName ./Desktop/sites/

Eu realmente não sei por onde começar com isso. Portanto, qualquer ajuda é apreciada

Responder1

Se você não quiser simplesmente usar mkdir -pe depois a cp, então você também pode criar uma função bastante robusta para copiar it wall always be the same folderpara o nome do diretório fornecido por dirnmcomo oprimeiro argumento(no diretório de trabalho atual se nenhum segundo argumento for fornecido) ou para /destpath/dirnmse um caminho representando destpathfor fornecido no argumento como osegundo argumento.

Ao formar os caminhos envolvidos, você precisará verificar (e remover) '/'caracteres iniciais e finais dirnme quaisquer caracteres finais '/'em destpath. You then attempt to createdestpath/dirnm as given and on success copyque sejam sempre a mesma pasta todestpath/dirnm (with the-a` opção, ou conforme desejado). Em caso de falha, lance o erro e retorne. A seguir está uma abordagem para tal função:

mkdircp ()
{
    srcdir="NameOfDirToCopy"    ## the name of the dir you always copy (w/full path)

    [ -d "$srcdir" ] || {       ## validate srcdir exists
        printf "error: source directory '%s' does not exist.\n" "$srcdir"
        return 1
    }

    [ -z $1 ] && {              ## validate that required dirnm given
        printf "usage: mdcp dirnm [destpath (default ./)]\n";
        return 1
    };

    ## trim leading/trailing '/' from dirnm
    [ ${1:0:1} == '/' ] && dirnm="${1:1}" || dirnm="$1"
    [ ${1:(-1)} == '/' ] && dirnm="${dirnm%/}"

    ## if destpath given, trim trailing '/' & set destdir
    if [ -n "$2" ]; then
        [ ${2:(-1)}x == '/x' ] && destpath="${2%/}" || destpath="$2"
        [ -n "$2" ] && destdir="${destpath}/${dirnm}"
    else
        destdir="./$dirnm"    ## default destdir in ./
    fi

    ## create destdir & validate or throw error
    [ -d "$destdir" ] || mkdir -p "$destdir"
    [ -d "$destdir" ] || {
        printf "error: unable to create destdir '%s'. (check permissions)\n" "$destdir"
        return 1
    }

    ## copy (-recursive -archive) "$srcdir" "$destdir"
    printf "copying:  %s -> %s\n" "$srcdir" "$destdir"
    # cp -a "$srcdir" "$destdir"    ## (uncomment for actual copy )
}

Eu incluiria a função em seu ~/.bashrc(ou ~/.profile) ou você pode inseri-la/exportá-la manualmente em seu shell atual. Eu também criaria uma maneira conveniente aliasde reduzir a digitação seguindo a declaração .bashrccomo:

alias mdcp='mkdircp'

Com o alias, o uso é:

mdcp dirnm [destpath (default: ./)]

Para copiar it wall always be the same folderpara destpath/dirnm. Deixe-me saber se você tiver alguma dúvida ou precisar ajustar um pouco as coisas.

Responder2

Eu usaria uma função. Adicione estas linhas ao seu ~/.profile(ou, se não estiver no OSX, ao seu ~/.bashrc):

createsite(){
    ## Change this to point to the folder you want to copy
    source="/path/to/source/folder"

    ## If no parameters were given, copy to the current directory
    if [ $# -eq 0 ];
    then    
        cp -rv "$source" .
    ## If an argument was given
    elif [ $# -eq 1 ]
    then
        ## Create the directory. The -p suppresses error messages
        ## in case the directory exists.
        mkdir "$1"
        ## Copy
        cp -rv "$source" "$1"/
    ## If more than one was given, something's wrong.
    else
        echo "Usage: $0 [target_directory]";
        exit 1;
    fi
}

Então, abra um novo terminal e você pode executar

createsite foo

O que copiará o conteúdo /path/to/source/folderpara o diretório recém-criado foo. Observe que esta é uma abordagem muito simplista e não avisa se o diretório existe ou se os arquivos serão sobrescritos.

Ou apenas execute createsitee ele será copiado para o diretório atual.

Responder3

rsync é um comando que pode ajudá-lo. Ele pode sincronizar 2 pastas com eficiência, observando as diferenças entre elas. Também funciona pela rede.

rsync source destination

A origem ou o destino podem ser expressões, como pwdou ${HOME}; relativo, como. ; ou fixo, como /tmp

Para mais informações, leia as belas páginas de manual:

man rsync

informação relacionada