
¿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:
- Nombre de la nueva carpeta donde copiar el contenido (es decir
mkdir myNewFolder
, ) - 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 -p
y luego a cp
, también puede crear una función bastante sólida para copiar it wall always be the same folder
al nombre del directorio dado por dirnm
comoprimer argumento(en el directorio de trabajo actual si no se proporciona un segundo argumento) o /destpath/dirnm
si se proporciona una ruta que representa destpath
en el argumento comosegundo argumento.
Al formar las rutas involucradas, deberá verificar (y eliminar) '/'
los caracteres iniciales y finales dirnm
y cualquier final '/'
en destpath. You then attempt to create
destpath/dirnm as given and on success copy
(siempre estará en la misma carpeta to
destpath/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 alias
para reducir la escritura después de la declaración .bashrc
como:
alias mdcp='mkdircp'
Con el alias, el uso es:
mdcp dirnm [destpath (default: ./)]
Para copiar it wall always be the same folder
a 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/folder
en 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 createsite
y 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 pwd
o ${HOME}; relativo, como. ; o fijo, como /tmp
Para obtener más información, lea las excelentes páginas del manual:
man rsync