Obtenha o caminho absoluto dos arquivos usando o comando 'find'

26

Existe uma maneira de obter o caminho absoluto de um arquivo que está sendo pesquisado?

Por exemplo:

find .. -name "filename"

Dá-me resultados como, ../filenamemas eu quero o caminho completo.

O que preciso é encontrar no diretório pai e seus filhos, para um arquivo específico, que usarei em outro script posteriormente.

obrigado

JorgeeFG
fonte
1
Pergunta semelhante sobre SO .
precisa saber é o seguinte

Respostas:

15

Tente algo como:

find "$(cd ..; pwd)" -name "filename"
Scrutinizer
fonte
Obrigado, eu estava apenas testando $(cd ..; pwd). Aqui funciona bem, mas se eu fizer sozinho em um terminal, não consigo obter o diretório pai ... recebo "Bash: <dir>: é um diretório. E se $(cd ..; echo "something")eu receber" algo: não um command "
JorgeeFG
Você quer dizer como um comando separado? Em seguida, você precisa deixar de fora o sinal de dólar:(cd ..; pwd)
Scrutinizer
Obrigado, foi isso. Qualquer referência de por que devo remover o $, como isso afeta o subshell?
JorgeeFG
1
Sim ( ... )significa executar em um subshell, a saída é gravada em stdout. $( ... )significa "substituição de comando". O último pode ser usado como se fosse uma expansão variável.
Scrutinizer
find / -name "filename"
Panther
12

Tente usar a -execopção de find:

find .. -name "filename" -exec readlink -f {} \;

Nota: readlinkimprime o valor de um link simbólico ou de um nome de arquivo canônico.

Sylvain Pineau
fonte
isso chamará readlink em todos os arquivos, por isso será muito ineficaz.
bac0n 16/10
9

Você pode usar basho Tilde Expansion para obter o caminho absoluto do diretório de trabalho atual, assim também findimprime o caminho absoluto para os resultados:

find ~+ -type f -name "filename"

Se executado ~/Desktop, isso é expandido para

find /home/yourusername/Desktop -type f -name "filename"

e imprime resultados como:

/home/yourusername/Desktop/filename

Se você quiser usar essa abordagem com o diretório pai do diretório de trabalho atual, precisará cdantes de chamar find:

cd .. && find ~+ -type f -name "filename"
sobremesa
fonte
7

A maneira mais simples é

find "$(pwd -P)" -name "filename"
Vivek
fonte
Sim! Oufind `pwd -P` -name "filename"
Apollys apoia Monica
isso encontrará arquivos no diretório atual e não do pai.
bac0n 16/10
1

O uso do PWD também pode mostrar o diretório completo. O Pwd mostrará todas as diretivas em que você está, como a expansão do nome do arquivo. Espero que isso tenha ajudado.

Sir_Dippingsauce
fonte
1

Isso funcionou para mim, mas retornará apenas a primeira ocorrência.

realpath $(find . -type f -name filename -print -quit)

Para obter caminhos completos para todas as ocorrências (como sugerido por Sergiy Kolodyazhnyy)

find . -type f -name filename | xargs realpath
Wyrmwood
fonte
Comentário anterior removido, +1, bom trabalho @Wyrmwood
Sergiy Kolodyazhnyy 16/10
1

Removendo o último componente do diretório com o parâmetro Expansion .

find "${PWD%/*}" -name 'filename'

Um exemplo de como você pode usar o mapfile para salvar a saída da localização em uma matriz indexada para uso posterior.

mapfile -t -d '' < <(find ${PWD%/*} -name 'filename' -print0)

(se nenhum nome de matriz for especificado, MAPFILE será o nome da matriz padrão).

for i in "${MAPFILE[@]}"; do
    echo "$((n++)) $i"
done
bac0n
fonte