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
Responder4
Isso corretamente deve ser feito em duas partes:
- 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
find
e-exec
- em seguida, envie vários arquivos usando
scp
scp
nã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".