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.
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?
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.
Stat lhe dará esta informação:
$ stat current
File: 'current' -> '/home/user/releases/build/'
...
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
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.
-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
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'"
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
readlink -f 'which java'
não funcionou para mim.
Mas isso aconteceu:
readlink -f $(which java)