Respostas:
Use o readlink :
readlink -f file.txt
brew install coreutils
em seguida,greadlink -f file.txt
Suponho que você esteja usando Linux.
Encontrei um utilitário chamado realpath
coreutils 8.15.
realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt
Conforme os comentários @ styrofoam-fly e @ arch-standton, por realpath
si só não verifica a existência do arquivo, para resolver isso, adicione o e
argumento:realpath -e file
realpath
estava comprometido com as coreutils repo final de 2011, a liberação 8,15 foi feito em janeiro de 2012, respondi a pergunta (com a readlink
sugestão) março 2011 :)
realpath -e
imprime um erro se o argumento não existir.
O seguinte geralmente faz o truque:
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
não funciona se o arquivo for um link simbólico, ele mostrará o destino do link simbólico em vez do próprio link simbólico.
readlink
me leva de volta ao diretório pai de onde o link simbólico gera, mas isso o ignora.
set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
### saída: / home / Ravi / ..
Eu sei que há uma maneira mais fácil disso, mas que se dane se eu puder encontrar ...
jcomeau@intrepid:~$ python -c 'import os; print(os.path.abspath("cat.wav"))'
/home/jcomeau/cat.wav
jcomeau@intrepid:~$ ls $PWD/cat.wav
/home/jcomeau/cat.wav
find $PWD -type f | grep "filename"
ou
find $PWD -type f -name "*filename*"
find `pwd` -type file -name \*.dmp
Shift
pressionado e clicar com o botão direito do mouse em um arquivo no Windows Explorer fornece uma opção chamada Copy as Path
. Isso copiará o caminho completo do arquivo para a área de transferência.realpath yourfile
para obter o caminho completo de um arquivo, conforme sugerido por outras pessoas.Eu sei que esta é uma pergunta antiga agora, mas apenas para adicionar as informações aqui:
O comando Linux which
pode ser usado para encontrar o caminho de um arquivo de comando, ou seja,
$ which ls
/bin/ls
Existem algumas advertências para isso; consulte https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .
Funciona em Mac, Linux, * nix:
Isso fornecerá um csv citado de todos os arquivos no diretório atual:
ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'
A saída disso pode ser facilmente copiada em uma lista python ou em qualquer estrutura de dados semelhante.
Você pode usar o script fpn (nome completo do caminho) :
% pwd
/Users/adamatan/bins/scripts/fpn
% ls
LICENSE README.md fpn.py
% fpn *
/Users/adamatan/bins/scripts/fpn/LICENSE
/Users/adamatan/bins/scripts/fpn/README.md
/Users/adamatan/bins/scripts/fpn/fpn.py
fpn
não é um pacote padrão do Linux, mas é um projeto gratuito e aberto do github e você pode configurá-lo em um minuto .
pwd
por si só, deve funcionar bem no Linux e na maioria dos outros ambientes de sistema operacional tipo Unix.
Você pode usar esta função. Se o nome do arquivo for fornecido sem o caminho relativo, presume-se que ele esteja presente no diretório de trabalho atual:
abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }
Uso:
$ abspath file.txt
/I/am/in/present/dir/file.txt
Uso com caminho relativo:
$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt
Com espaços no nome do arquivo:
$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt
Em um cenário semelhante, estou lançando um script cshell de outro local. Para definir o caminho absoluto correto do script para que seja executado apenas no diretório designado, estou usando o seguinte código:
set script_dir = `pwd`/`dirname $0`
$0
armazena a string exata de como o script foi executado.
Por exemplo, se o script foi lançado como este: $> ../../test/test.csh
,
$script_dir
conterá/home/abc/sandbox/v1/../../test
./test.csh
, terá um caminho que termina com/test/.
No Mac OS X, substituí os utilitários que acompanham o sistema operacional e os substitui por uma versão mais recente do coreutils. Isso permite acessar ferramentas como readlink -f
(para o caminho absoluto dos arquivos) e realpath
(caminho absoluto dos diretórios) no seu Mac.
A versão Homebrew acrescenta um 'G' (para GNU Tools) na frente do nome do comando - para que os equivalentes se tornem greadlink -f FILE
e grealpath DIRECTORY
.
Instruções para instalar as ferramentas coreutils / GNU no Mac OS X através do Homebrew podem ser encontradas neste artigo do StackExchange .
Nota: Os comandos readlink -f
e realpath
devem funcionar imediatamente para usuários que não sejam Mac Unix.
brew install coreutils
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
Esta é uma explicação do que está acontecendo na resposta de @ ZeRemz :
"$1"
dirname "$1"
cd "$(dirname "$1")
entramos nesse diretório relativo&& pwd -P
e obtenha um caminho absoluto para isso. -P
opção evitará todos os links simbólicos$(basename "$1")
echo
eleIsso funcionou muito bem para mim. Ele não depende do sistema de arquivos (um profissional / con, dependendo da necessidade), por isso será rápido; e, deve ser portátil para a maioria dos * NIX. Ele assume que a sequência passada é realmente relativa ao PWD e não a outro diretório.
function abspath () {
echo $1 | awk '\
# Root parent directory refs to the PWD for replacement below
/^\.\.\// { sub("^", "./") } \
# Replace the symbolic PWD refs with the absolute PWD \
/^\.\// { sub("^\.", ENVIRON["PWD"])} \
# Print absolute paths \
/^\// {print} \'
}
Isso é ingênuo, mas eu precisava torná-lo compatível com POSIX. Requer permissão para cd no diretório do arquivo.
#!/bin/sh
if [ ${#} = 0 ]; then
echo "Error: 0 args. need 1" >&2
exit 1
fi
if [ -d ${1} ]; then
# Directory
base=$( cd ${1}; echo ${PWD##*/} )
dir=$( cd ${1}; echo ${PWD%${base}} )
if [ ${dir} = / ]; then
parentPath=${dir}
else
parentPath=${dir%/}
fi
if [ -z ${base} ] || [ -z ${parentPath} ]; then
if [ -n ${1} ]; then
fullPath=$( cd ${1}; echo ${PWD} )
else
echo "Error: unsupported scenario 1" >&2
exit 1
fi
fi
elif [ ${1%/*} = ${1} ]; then
if [ -f ./${1} ]; then
# File in current directory
base=$( echo ${1##*/} )
parentPath=$( echo ${PWD} )
else
echo "Error: unsupported scenario 2" >&2
exit 1
fi
elif [ -f ${1} ] && [ -d ${1%/*} ]; then
# File in directory
base=$( echo ${1##*/} )
parentPath=$( cd ${1%/*}; echo ${PWD} )
else
echo "Error: not file or directory" >&2
exit 1
fi
if [ ${parentPath} = / ]; then
fullPath=${fullPath:-${parentPath}${base}}
fi
fullPath=${fullPath:-${parentPath}/${base}}
if [ ! -e ${fullPath} ]; then
echo "Error: does not exist" >&2
exit 1
fi
echo ${fullPath}
Gosto de muitas das respostas já fornecidas, mas achei isso realmente útil, especialmente em um script, para obter o caminho completo de um arquivo, incluindo os links simbólicos e as referências relativas, como .
e..
dirname `readlink -e relative/path/to/file`
O que retornará o caminho completo do a file
partir do caminho raiz. Isso pode ser usado em um script para que o script saiba de qual caminho está sendo executado, o que é útil em um clone de repositório que pode estar localizado em qualquer lugar da máquina.
basePath=`dirname \`readlink -e $0\``
Posso então usar a ${basePath}
variável nos meus scripts para referenciar diretamente outros scripts.
Espero que isto ajude,
Dave
Você pode salvar isso no seu shell.rc
ou simplesmente colocar no console
function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"
exemplo:
ap somefile.txt
irá produzir
/home/user/somefile.txt
ap ../foobar.txt
vai dar /home/user/../foobar.txt
, o que geralmente não é o que você deseja.
ap /tmp/foobar.txt
vai dar /home/user//tmp/foobar.txt
, o que está errado.
find / -samefile file.txt -print
Encontrará todos os links para o arquivo com o mesmo número de inode que o arquivo.txt
adicionar um -xdev
sinalizador evitará find
cruzar os limites do dispositivo ("pontos de montagem"). (Mas isso provavelmente não fará com que nada seja encontrado se o find
arquivo não iniciar em um diretório no mesmo dispositivo que file.txt
)
Observe que find
pode relatar vários caminhos para um único objeto do sistema de arquivos, porque um Inode pode ser vinculado por mais de uma entrada de diretório, possivelmente até usando nomes diferentes. Por exemplo:
find /bin -samefile /bin/gunzip -ls
Saída:
12845178 4 -rwxr-xr-x 2 root root 2251 feb 9 2012 /bin/uncompress
12845178 4 -rwxr-xr-x 2 root root 2251 feb 9 2012 /bin/gunzip
Isso funciona com Linux e Mac OSX.
echo $(pwd)$/$(ls file.txt)
No Mac OS, se você deseja apenas localizar o caminho de um arquivo no localizador, clique com o botão direito no arquivo e role para baixo até "Serviços" na parte inferior. Você tem muitas opções, incluindo "caminho da cópia" e "caminho completo da cópia". Clicar em um deles coloca o caminho na área de transferência.
No mac mencionado abaixo a linha funciona. Não há necessidade de adicionar linhas sofisticadas.
> pwd filename
print working directory
No Mac OSX, execute as seguintes etapas:
cd
no diretório do arquivo de destino.ls "`pwd`/file.txt"
echo $(pwd)/file.txt
file.txt
pelo seu nome de arquivo real.Ao lado de "readlink -f", outro comando comumente usado:
$find /the/long/path/but/I/can/use/TAB/to/auto/it/to/ -name myfile /the/long/path/but/I/can/use/TAB/to/auto/it/to/myfile $
Isso também fornece o caminho completo e o nome do arquivo no console
Fora do tópico: esse método fornece apenas links relativos , não absolutos. O readlink -f
comando é o correto.
Crie uma função como a abaixo (ecoa o caminho absoluto de um arquivo com pwd e adiciona o arquivo no final do caminho:
abspath() { echo $(pwd "$1")/"$1"; }
Agora você pode encontrar qualquer caminho de arquivo:
abspath myfile.ext