usando scp renomeando todos os arquivos

0

Estou enviando arquivos de um servidor para outro usando scp. Eu preciso renomear arquivos depois de enviar isso. Então eu uso o seguinte comando para cada arquivo

scp original-hc.db user@host:/dir/original-hc_1.db

Eu quero enviar todos os arquivos usando um único comando com a renomeação de arquivos. Como

scp *.db user@host:/dir/(actual file name before extension)_1.db
    
por Arya Ray 31.08.2016 / 19:23

2 respostas

5

Isso pode ser facilmente alcançado com um loop

for f in *.db
do
    scp "$f" user@host:/dir/"${f%.db}"_1.db
done

A construção ${f%.db} retira o sufixo .db de $f .

    
por 31.08.2016 / 19:34
2

scp não pode renomear arquivos, portanto, você precisará usar outra ferramenta ou alternativa.

Se você tiver acesso SFTP e não apenas acesso SCP, poderá usar SSHFS para exibir os arquivos remotos sua máquina local. Isso permite que você use qualquer ferramenta de cópia e renomeação de arquivos.

mkdir mnt
sshfs user@host:/dir
pax -rw -pe -s'/\.db$/_1.db/' *.db mnt
fusermount -u mnt

Em vez de pax (que é POSIX mas às vezes não é instalado por padrão no Linux embora esteja sempre disponível como pacote), você pode usar o GNU ou o BSD, zsh zcp , etc. Ou apenas um loop que faz a cópia:

for x in *.db; do
  cp -p "$x" "mnt/${x%.db}_1.db"
done

Você pode usar o método loop mesmo se você não tiver SSHFS, mas você tem que usar scp no loop.

for x in *.db; do
  scp -p "$x" "user@host:/dir/${x%.db}_1.db"
done

A configuração de uma conexão SSH para cada vez pode ser um pouco lenta. Com o OpenSSH, você pode abrir a conexão uma vez e, em seguida, pegar carona nela. Consulte Como usar um canal SSH já estabelecido

Outro método (que requer acesso total ao shell no servidor) é arquivar os arquivos e copiar o arquivo, e aplicar uma etapa de renomeação ao arquivar ou ao extrair. Por exemplo, se você tem o GNU tar localmente (o que é sempre o caso do Linux não embutido e frequentemente disponível, talvez como gtar , em outras variantes unix):

tar -cf - --transform '/\.db$/_1.db/ *.db | ssh user@host 'cd /dir && tar -xf -'

Com o tar do BSD, substitua --transform por -s . Se você tem um tar muito limitado localmente, mas o tar GNU ou o BSD tar no servidor, você pode fazer a renomeação no lado do servidor.

Você pode querer inserir uma etapa de compactação se a largura de banda da rede for o gargalo. Com o método de arquivamento, você pode inserir etapas no pipeline:

tar -czf - --transform '/\.db$/_1.db/ *.db | ssh user@host 'cd /dir && gunzip | tar -xf -'

Ou você pode fazer a compactação no nível do SSH, passando a opção -C para ssh , sshfs ou scp .

    
por 01.09.2016 / 09:51