Cree un nuevo comando de Terminal Mac para copiar la carpeta

Cree un nuevo comando de Terminal Mac para copiar la carpeta

¿Cómo puedo crear un nuevo comando de terminal que copie una carpeta (siempre será la misma carpeta) y su contenido en el directorio actual (si no se proporciona ninguna ruta) o en la ruta proporcionada?

Este comando debe tomar los siguientes parámetros:

  1. Nombre de la nueva carpeta donde copiar el contenido (es decir mkdir myNewFolder, )
  2. La ruta del directorio en el que crear la nueva carpeta y pegar el contenido.

Me gustaría terminar con algo como esto:

$ createsite newFolderName ./Desktop/sites/

Realmente no sé por dónde empezar con esto. Asi que se agradece cualquier ayuda

Respuesta1

Si no desea simplemente usar mkdir -py luego a cp, también puede crear una función bastante sólida para copiar it wall always be the same folderal nombre del directorio dado por dirnmcomoprimer argumento(en el directorio de trabajo actual si no se proporciona un segundo argumento) o /destpath/dirnmsi se proporciona una ruta que representa destpathen el argumento comosegundo argumento.

Al formar las rutas involucradas, deberá verificar (y eliminar) '/'los caracteres iniciales y finales dirnmy cualquier final '/'en destpath. You then attempt to createdestpath/dirnm as given and on success copy(siempre estará en la misma carpeta todestpath/dirnm (with the-a`, o como desee). En caso de error, arroja error y regresa. La siguiente es una aproximación a dicha función:

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 )
}

Incluiría la función en su ~/.bashrc(o ~/.profile) o puede ingresarla/exportarla manualmente en su shell actual. También crearía una opción conveniente aliaspara reducir la escritura después de la declaración .bashrccomo:

alias mdcp='mkdircp'

Con el alias, el uso es:

mdcp dirnm [destpath (default: ./)]

Para copiar it wall always be the same foldera destpath/dirnm. Déjame saber si tienes alguna pregunta o necesitas ajustar un poco las cosas.

Respuesta2

Yo usaría una función. Agregue estas líneas a su ~/.profile(o, si no está en OSX, a su ~/.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
}

Luego, abre una nueva terminal y podrás ejecutar

createsite foo

Que copiará el contenido /path/to/source/folderen el directorio recién creado foo. Tenga en cuenta que este es un enfoque muy simplista y no le advertirá si el directorio existe o si se sobrescribirán los archivos.

O simplemente ejecútelo createsitey se copiará al directorio actual.

Respuesta3

rsync es un comando que podría ayudarte. Puede sincronizar 2 carpetas de manera eficiente observando las diferencias entre ellas. También funciona a través de la red.

rsync source destination

Tanto el origen como el destino pueden ser expresiones como pwdo ${HOME}; relativo, como. ; o fijo, como /tmp

Para obtener más información, lea las excelentes páginas del manual:

man rsync

información relacionada