Estou procurando por um comando simples que possa ser usado no Bash para encontrar o caminho absoluto e canônico para um arquivo em um OS X (semelhante a `` readlink -f '' no Linux).
A seguinte sessão de amostra do bash descreve um utilitário [fictício] chamado `` abspath '' que exibe o comportamento desejado:
$ pwd
/Users/guyfleegman
$ ls -lR
drwxr-xr-x 4 guyfleegman crew 136 Oct 30 02:09 foo
./foo:
-rw-r--r-- 1 guyfleegman crew 0 Oct 30 02:07 bar.txt
lrwxr-xr-x 1 guyfleegman crew 7 Oct 30 02:09 baz.txt -> bar.txt
$ abspath .
/Users/guyfleegman
$ abspath foo
/Users/guyfleegman/foo
$ abspath ./foo/bar.txt
/Users/guyfleegman/foo/bar.txt
$ abspath foo/baz.txt
/Users/guyfleegman/foo/baz.txt
Como na última chamada de `` abspath '' no exemplo acima, eu preferiria que não resolvesse links simbólicos automaticamente, mas não serei muito exigente aqui.
macos
osx-snow-leopard
bash
shell
Michael Wehner
fonte
fonte
Respostas:
Exemplos:
fonte
Eu não acho que exista um comando buildin que faça isso. Jesse Wilson escreveu um script bash para isso:
No entanto, ele não funciona bem para caminhos diretamente abaixo
/
, como/etc
(impressão//etc
), bem como.
e..
(impressão/cwd/.
nos dois casos). Tentei modificá-lo, mas meu bash-fu insuficiente falhou comigo.Aqui está a minha sugestão:
Salve como
/usr/bin/abspath
ou algo parecido e torne-o executável. Saída de amostra:Se você fazer deseja symlink resolução, altere a
print
linha como esta:para conseguir esta:
fonte
file /usr/bin/xattr
Uma opção seria apenas instalar o coreutils e usar
greadlink -f
. Ele resolve links simbólicos e funciona com/Foo/
ou~/foo.txt
se eles não existem, mas não com/Foo/foo.txt
se/Foo/
não existe.Isso não resolve os links simbólicos e também não funciona
/Foo/foo.txt
.dirs -l
realiza expansão til.dirs +0
imprime apenas o diretório superior se houver outros diretórios na pilha.fonte
Eu acho que você poderia fazê-lo com python ou ruby.
ou faça um comando com
fonte
Se você possui o módulo File :: Spec instalado para perl, basta fazer o seguinte:
fonte
Para scripts bash / sh, você pode usar esta função recursiva:
fonte
__filename
. Atualmente, o script se comporta dedirname
maneira semelhante .Instale a seguinte biblioteca para OSX:
fonte
Se a instalação do coreutils não for uma opção, o seguinte manipula combinações de links simbólicos,. e .. e funciona em arquivos e pastas como o GNU realpath:
Mas não suporta realpath - relativo a. Isso exigiria /programming//a/12498485/869951 .
fonte
Dado que a restrição é o MacOS (OS X na época), o PHP está disponível por padrão. Isso retornará o diretório raiz do arquivo. Remova
dirname
para obter o arquivo também.fonte