O scp pode criar um diretório se ele não existir?

68

Eu quero usar scp para fazer upload de arquivos, mas às vezes o diretório de destino pode não existir.

É possível criar a pasta automaticamente? Se sim, como? Se não, que maneira alternativa posso tentar?

    
por AGamePlayer 30.03.2015 / 15:06

5 respostas

54

Esta é uma das muitas coisas que rsync pode fazer.

Se você estiver usando uma versão de rsync lançada nos últimos anos, ¹ sua sintaxe de comando básica é semelhante a scp : ²

$ rsync -r local-dir remote-machine:path

Isso copiará local-source e seu conteúdo para $HOME/path/local-dir na máquina remota, criando os diretórios necessários .³

rsync tem algumas restrições aqui que podem afetar se isso funcionará em sua situação específica. Ele não criará vários níveis de diretórios remotos ausentes, por exemplo; ele só criará até um nível ausente no controle remoto. Você pode contornar isso facilmente precedendo o comando rsync com algo assim:

$ ssh remote-host 'mkdir -p foo/bar/qux'

Isso criará a árvore $HOME/foo/bar/qux se ela não existir. Não vai reclamar ou fazer qualquer outra coisa ruim se já existir .

rsync às vezes tem outros comportamentos surpreendentes. Basicamente, você está pedindo para descobrir o que você queria copiar, e suas suposições podem não corresponder às suas suposições. Experimente e veja. Se ele não se comportar como esperado e você não puder ver o motivo, publique mais detalhes sobre as configurações de diretório locais e remotas e forneça o comando que você tentou.

Notas de rodapé :

  1. Antes de rsync 2.6.0 (1 de janeiro de 2004), era necessário que o sinalizador -e ssh fizesse com que ele se comportasse como scp , porque o padrão era o obsoleto Protocolo RSH .

  2. scp e rsync compartilham alguns sinalizadores, mas há apenas um pouco de sobreposição.

  3. Ao usar SSH como o protocolo de transferência, rsync usa os mesmos padrões. Portanto, assim como scp , assumirá que há um usuário com o mesmo nome que seu usuário local na máquina remota por padrão.

por 30.03.2015 / 15:21
29

Se você estiver copiando um grupo de arquivos, na verdade não. Se você estiver copiando um diretório e todo o conteúdo abaixo dele, sim. Dado este comando:

$ scp -pr /source/directory user@host:the/target/directory

Se directory não existir em ~/the/target on host , ele será criado. Se, no entanto, ~the/target não existir, você provavelmente terá problemas - não me lembro dos resultados exatos deste caso, mas esteja preparado para que o pretendido scp falhe.

    
por 30.03.2015 / 15:21
13

Até onde eu sei, scp em si não pode fazer isso, não. No entanto, você poderia apenas ssh para a máquina de destino, criar o diretório e, em seguida, copiar. Algo como:

ssh user@host "mkdir -p /target/path/" &&
    scp /path/to/source user@host:/target/path/

Observe que, se você estiver copiando diretórios inteiros, o acima não será necessário. Por exemplo, para copiar o diretório ~/foo para o host remoto, você poderia usar o sinalizador -r (recursive):

scp ~/foo/ user@host:~/

Isso criará o diretório de destino ~/foo no host remoto. No entanto, ele não pode criar o diretório pai. scp ~/foo user@host:~/bar/foo falhará, a menos que o diretório de destino bar exista. Em qualquer caso, o sinalizador -r não ajudará a criar um diretório de destino se você estiver copiando arquivos individuais.

    
por 30.03.2015 / 15:11
3

Sim, você pode. De acordo com a página man do scp:

man scp

.....

-r Recursively copy entire directories. Note that scp follows symâ bolic links encountered in the tree traversal.

....

    
por 30.03.2015 / 15:22
2

Eu uso a seguinte função antes de transferir btrfs instantâneos sobre ssh :

check_remote_dir() {
        printf "\ntesting remote directory: '$1' "

        if ssh -p $PORT $ROOT@$REMOTE "[ ! -d $1 ]"; then
                printf "\nCreating: $1 on $ROOT@$REMOTE\n"
                ssh -p $PORT $ROOT@$REMOTE "mkdir -p $1"
        else
                printf "[OK]\n"
        fi
}

Basta chamar a função no seu script com:

check_remote_dir /my/remote/path

    
por 26.06.2017 / 05:32

Tags