Como obter o caminho completo do arquivo original de um link simbólico?

79

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 puder obter o caminho absoluto do arquivo de origem, posso sep com ele. Como posso obter o caminho?

    
por Eonil 06.10.2011 / 04:53

7 respostas

107

Experimente esta linha:

readlink -f 'which command'

Se command estiver na sua variável $PATH , caso contrário, você precisará especificar o caminho que você conhece.

    
por 06.10.2011 / 05:40
17

No Linux, readlink lê o conteúdo de um symlink e readlink -f segue links simbólicos para links simbólicos para links simbólicos, etc., até encontrar algo que não seja um link simbólico.

Isso não é necessário para o scp: o scp sempre segue os links simbólicos (sempre copia o conteúdo do arquivo, ignorando os metadados, exceto que -p preserva os tempos de arquivo e os modos quando possível).

Se você se sentir desapontado 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 tipo de jardim (horários, links simbólicos, permissões e propriedade) e há opções para preservar metadados exóticos, como ACLs e links físicos.

    
por 07.10.2011 / 01:06
6

Stat lhe dará esta informação:

$ stat current
  File: 'current' -> '/home/user/releases/build/'
  ...
    
por 06.10.2011 / 05:00
6

Eu uso o comando ls , stat , readlink .

Pegue o arquivo /etc/localtime como um exemplo

[flying@lempstacker ~]$ ls /etc/localtime 
/etc/localtime
[flying@lempstacker ~]$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 35 Aug  2 22:41 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai

Operação

Usando stat

[flying@lempstacker ~]$ stat /etc/localtime
  File: ‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’
  Size: 35          Blocks: 0          IO Block: 4096   symbolic link
Device: fd01h/64769d    Inode: 272202388   Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-11-23 09:00:59.999887800 +0800
Modify: 2016-08-02 22:41:26.090389904 +0800
Change: 2016-08-02 22:41:26.090389904 +0800
 Birth: -
[flying@lempstacker ~]$ stat -c "%N" /etc/localtime
‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’

Usando readlink

[flying@lempstacker ~]$ readlink /etc/localtime
../usr/share/zoneinfo/Asia/Shanghai
[flying@lempstacker ~]$ readlink -f /etc/localtime
/usr/share/zoneinfo/Asia/Shanghai

Parece que o comando readlink -f é melhor.

Explicação

-f, --canonicalize: canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist —— From man readlink

    
por 23.11.2016 / 09:45
4

Você pode fazer

readlink -f 'which command'

ou você pode obter algo semelhante no Linux com

stat 'which command' | grep File

Se você estiver adicionando isso a um script, inspecione o erro. Se você não quer ver a mensagem de erro no caso quando o link sym não está lá, vá com algo como

readlink -f "'which command'" 
    
por 25.02.2016 / 22:52
3

Eu usaria realpath <symlink> .

Provavelmente, o que você chama de "origem" é o arquivo "de destino" de acordo com o uso de ln : Usage: ln [OPTION]... [-T] TARGET LINK_NAME

    
por 11.02.2017 / 12:32
0

readlink -f 'which java' não funcionou para mim.

Mas isso aconteceu:

readlink -f $(which java)
    
por 27.06.2017 / 19:52

Tags