Como posso verificar se um caminho remoto é um diretório ou um arquivo?

2

Estou procurando uma maneira curta e fácil de verificar se um caminho remoto aponta para um diretório (ou um diretório com link simbólico) ou para um arquivo legível.

Se for um diretório, então eu posso scp vários arquivos específicos de dentro desse diretório para o meu sistema local, enquanto se for um arquivo eu só posso scp desse arquivo.

Eu tenho o caminho do arquivo dado em scp -manner como user@host:/path/to/dir-or-file .

Nota: No sistema local (MobaXterm no Windows) eu tenho bash , scp e ssh disponível, enquanto o sistema remoto (no qual o caminho fica eu quero verificar) é uma distribuição Linux completa .

    
por halloleo 12.07.2018 / 09:26

4 respostas

6

Você está tentando transferir o arquivo (se for um arquivo) ou partes do diretório (se for um diretório).

if ! scp user@host:/path/to/dir-or-file local/path
then
    scp user@host:/path/to/dir-or-file/some-specific-file local/path
fi

Se scp for instruído a transferir um diretório sem sua opção -r , ele falhará. Você pode usar isso para detectar se o caminho fornecido no host remoto é um diretório ou não e, em seguida, invocar scp uma segunda vez para obter arquivos específicos dentro do diretório se o primeiro scp não puder obter o nome do caminho como um arquivo.

Claro, se você quiser transferir o diretório todo (se for um diretório), você pode fazer

scp -r user@host:/path/to/dir-or-file local/path

que funcionaria independentemente de o caminho ser de um diretório ou arquivo.

    
por 12.07.2018 / 09:55
2

Você pode executar o seguinte comando:

ssh user@host file /path/to/dir-or-file

O resultado estará entre os possíveis tipos de arquivo:

/path/to/dir-or-file: directory
/path/to/dir-or-file: symbolic link to 'whatever'
/path/to/dir-or-file: UTF-8 Unicode text
/path/to/dir-or-file: ELF 64-bit LSB executable ... 
....

Nota: se você só precisa testar o diretório ou não dentro de um script de shell bash, você poderia simplesmente usar o teste como:

ssh user@host test -d /path/to/dir-or-file
if [ $? -eq 0 ]; then 
  echo this is a dir
else 
  echo this is not a dir
fi
    
por 12.07.2018 / 09:41
1

Uma abordagem rápida e suja, se você não se importa com uma mensagem de erro e você só precisa copiar arquivos não-ponto, é isso

scp -p asuser@host:'/path/to/dir-or-file/*' asuser@host:'/path/to/dir-or-file' .

O ponto final copia os arquivos remotos para o diretório atual. Ajuste a gosto. O sinalizador -p mantém o registro de data e hora e as permissões. Omitir se isso não for necessário.

    
por 12.07.2018 / 09:55
-1

Esta informação também está disponível na saída de ls: o primeiro símbolo na primeira coluna é: "d" para o diretório "l" para links

    
por 12.07.2018 / 09:49