
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:
- Nome da nova pasta para onde copiar o conteúdo (ou seja
mkdir myNewFolder
) - 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 -p
e depois a cp
, então você também pode criar uma função bastante robusta para copiar it wall always be the same folder
para o nome do diretório fornecido por dirnm
como oprimeiro argumento(no diretório de trabalho atual se nenhum segundo argumento for fornecido) ou para /destpath/dirnm
se um caminho representando destpath
for fornecido no argumento como osegundo argumento.
Ao formar os caminhos envolvidos, você precisará verificar (e remover) '/'
caracteres iniciais e finais dirnm
e quaisquer caracteres finais '/'
em destpath. You then attempt to create
destpath/dirnm as given and on success copy
que sejam sempre a mesma pasta to
destpath/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 alias
de reduzir a digitação seguindo a declaração .bashrc
como:
alias mdcp='mkdircp'
Com o alias, o uso é:
mdcp dirnm [destpath (default: ./)]
Para copiar it wall always be the same folder
para 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/folder
para 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 createsite
e 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 pwd
ou ${HOME}; relativo, como. ; ou fixo, como /tmp
Para mais informações, leia as belas páginas de manual:
man rsync