Eu quero scp
um arquivo para um servidor. O arquivo é um link simbólico e, na verdade, o que eu quero fazer é copiar o arquivo de origem. De qualquer forma, não quero rastrear o caminho do arquivo de origem manualmente, porque ele pode ser substituído. Se eu posso obter o caminho absoluto do arquivo de origem, posso obtê- sep
lo. Como posso pegar o caminho?
99
scp
versões segue links simbólicos por padrão, não é? Você deve verificar o seu e talvez poupar algum trabalho.scp -r
força o seguinte link simbólico.Respostas:
Tente esta linha:
Se
command
estiver na sua$PATH
variável, caso contrário, você precisará especificar o caminho que conhece.fonte
-f
retornará um caminho para um destino final inexistente, desde que os destinos do link intermediário existam ... Use-e
para evitar isso, por exemplo.-e
retornará nulo se o destino final não existir.-f
com erroreadlink: illegal option -- f
no OSX. Removê-lo funcionou bem.greadlink
.No Linux,
readlink
lê o conteúdo de um link simbólico ereadlink -f
segue links simbólicos para links simbólicos etc., até encontrar algo que não seja um link simbólico.Porém, isso não é necessário para o scp: o scp sempre segue links simbólicos (ele sempre copia o conteúdo do arquivo, ignorando os metadados, exceto que
-p
preserva os tempos e modos do arquivo, quando possível).Se você se decepcionar com o que os metadados scp podem e não podem preservar, sugiro usar o rsync. Sem opção, o rsync copia o conteúdo do arquivo ignorando os metadados. A opção comumente usada
-a
preserva todos os metadados de variedade de jardim (horários, links simbólicos, permissões e propriedade) e existem opções para preservar metadados exóticos, como ACLs e links físicos.fonte
Eu uso de comando
ls
,stat
,readlink
.Tome o arquivo
/etc/localtime
como um exemploOperação
Usando stat
Usando o readlink
Parece que esse comando
readlink -f
é melhor.Explicação
fonte
O Stat fornecerá essas informações:
fonte
Você pode fazer
ou você pode obter algo semelhante no Linux com
Se você estiver adicionando isso a um script, inspecione o erro. Se você não quiser ver a mensagem de erro no caso em que o link sym não estiver lá, escolha algo como
fonte
Eu usaria
realpath <symlink>
.Provavelmente o que você chama de 'origem' é o arquivo 'destino' de acordo com o uso de
ln
:Usage: ln [OPTION]... [-T] TARGET LINK_NAME
fonte
readlink
não cortou ... mac estúpido. lolreadlink -f 'which java'
não funcionou para mim.Mas isso fez:
fonte
`
não'
.. mas$()
é melhor prática de qualquer maneira.$()
é uma prática melhor.command
, mas isso foi preterido. usar $ () é melhor, porque o encapsulamento $ ($ (command)) é muito mais fácil e não precisa de escape especial. Então é preferido. No seu primeiro exemplo, você usou o apóstrofo usual, e o readlink está tentando encontrar o arquivo chamado 'what java' com espaço em seu nome. Mas sua intenção é chamar o comando que, com o argumento java, para encontrar o caminho executável binário do java.No MAC OX, o parâmetro "-f" não funciona, o 'readlink' funciona sem nenhum parâmetro.
fonte