scp todos os arquivos que terminam em '-123.jpg' - recursão, espaços, curingas…

scp todos os arquivos que terminam em '-123.jpg' - recursão, espaços, curingas…

Há muita coisa acontecendo para eu colocar minha cabeça de noobie por aqui. Quero baixar todos os arquivos que terminam em -123.jpg de vários diretórios aninhados em um servidor remoto. Alguns desses diretórios possuem espaços em seus nomes. Estou pensando que o comando deve ser mais ou menos assim:

scp -r user@server:/path/to/parent\ directory/*/*/*123\.jpg ./

… onde "pai\diretório" é um nome de diretório com um espaço, e o caminho especificado vai o mais fundo possível antes de se dividir em vários subdiretórios, por exemplo dir/sub dir/[uniquely_id]-123.jpg arquivo . (Observe que esses subdiretórios geralmente também contêm espaços, caso isso afete o curinga *)

Estou recebendo 'nenhuma correspondência' retornada para isso ou 'nenhum arquivo ou diretório' se eu interferir no escape do espaço. Estou pensando, portanto, que foi a recursão ou o curinga que entendi errado.

Desde já, obrigado.

Responder1

O escape do nome do arquivo com scp é complicado; seus argumentos são (re)expandidos no lado remoto. Caracteres "interessantes" devem estar entre aspas duplas, para evitar manuseio especial pelo shell local e pelo controle remoto. Eu esperaria que ambos os itens a seguir funcionassem para você:

scp user@server:'/path/to/parent\ directory/*/*/*123.jpg' ./
scp user@server:'"/path/to/parent directory"/*/*/*123.jpg' ./

Se isso for confuso, o rsync é muito fácil de usar (como Lothar menciona), e canalizar tar ou cpio através do ssh também é muito fácil.

ssh user@server 'cd /path/to/parent\ directory;
                 find -name "*123.jpg" -print0 | cpio -0 -o' |
    cpio -i -d -v

Responder2

Na falta do layout do servidor para teste, não sei se o comando a seguir realmente funciona, mas acho que o rsync seria melhor que o scp nesse caso, já que você pode especificar padrões de entrada e exclusão. Algo como:

rsync -arvzSH  --include "*123.jpg" --exclude "*" user@server:/path/to/parent\ directory/ /path/to/target directory/

pode funcionar. Mas é melhor você verificar novamente odocumentação rsync.

Responder3

Uma solução alternativa para scp com curingas:

for i in "*-123.jpg"
do 
    scp $i <user>@<server>:/path/to/destination/
done

Referir:https://community.hpe.com/t5/System-Administration/How-to-scp-mutiple-files-using-wild-chars-or-in-a-single-scp/mp/3639440/highlight/true# M238959

Responder4

Isso corretamente deve ser feito em duas partes:

  1. primeiro encontre todos os arquivos necessários e copie-os para uma pasta (isso não funciona se você tiver os mesmos nomes de arquivos) - você pode fazer isso com um finde-exec
  2. em seguida, envie vários arquivos usandoscp

scpnão é avançado o suficiente para copiar a estrutura de pastas e não existe um comando único para fazer uma cópia de uma árvore de pastas.

Além disso, se você precisar de todos os arquivos em pastas, já que não poderá selecioná-los por curingas e quiser preservar a estrutura das pastas - você pode usar mc= Midnight Commander e seu "link Shell".

informação relacionada