bash - color - theme oh my fish




Comando bash/fish para imprimir o caminho absoluto para um arquivo (12)

Aqui está uma função somente de zsh que eu gosto por sua compacidade. Ele usa o modificador de expansão 'A' - veja zshexpn (1).

realpath() { for f in "[email protected]"; do echo ${f}(:A); done }

Pergunta: existe um comando simples sh / bash / zsh / fish / ... para imprimir o caminho absoluto de qualquer arquivo que eu o alimente?

Caso de uso: Estou no diretório /a/b e gostaria de imprimir o caminho completo para o arquivo c na linha de comando, para que eu possa colá-lo facilmente em outro programa: /a/b/c . Simples, mas um pequeno programa para fazer isso provavelmente poderia me poupar 5 segundos ou mais quando se trata de lidar com caminhos longos, o que, no final, acrescenta. Então me surpreende que não consiga encontrar um utilitário padrão para fazer isso - realmente não existe nenhum?

Aqui está uma implementação de amostra, abspath.py:

#!/usr/bin/python
# Author: Diggory Hardy <[email protected]>
# Licence: public domain
# Purpose: print the absolute path of all input paths

import sys
import os.path
if len(sys.argv)>1:
    for i in range(1,len(sys.argv)):
        print os.path.abspath( sys.argv[i] )
    sys.exit(0)
else:
    print >> sys.stderr, "Usage: ",sys.argv[0]," PATH."
    sys.exit(1)

Ei pessoal, eu sei que é um tópico antigo, mas estou postando isso para referência a qualquer outra pessoa que tenha visitado isso como eu. Se eu entendi a pergunta corretamente, acho que o comando locate $filename . Exibe o caminho absoluto do arquivo fornecido, mas apenas se existir.


Esse caminho relativo para a função de shell do conversor de caminho absoluto

  • não requer utilitários (apenas cd e pwd )
  • funciona para diretórios e arquivos
  • alças .. e .
  • manipula espaços em dir ou nomes de arquivos
  • requer que o arquivo ou diretório exista
  • não retorna nada se nada existir no caminho dado
  • lida com caminhos absolutos como entrada (passa-os essencialmente)

Código:

function abspath() {
    # generate absolute path from relative path
    # $1     : relative filename
    # return : absolute path
    if [ -d "$1" ]; then
        # dir
        (cd "$1"; pwd)
    elif [ -f "$1" ]; then
        # file
        if [[ $1 = /* ]]; then
            echo "$1"
        elif [[ $1 == */* ]]; then
            echo "$(cd "${1%/*}"; pwd)/${1##*/}"
        else
            echo "$(pwd)/$1"
        fi
    fi
}

Amostra:

# assume inside /parent/cur
abspath file.txt        => /parent/cur/file.txt
abspath .               => /parent/cur
abspath ..              => /parent
abspath ../dir/file.txt => /parent/dir/file.txt
abspath ../dir/../dir   => /parent/dir          # anything cd can handle
abspath doesnotexist    =>                      # empty result if file/dir does not exist
abspath /file.txt       => /file.txt            # handle absolute path input

Nota: Isso é baseado nas respostas de nolan6000 e bsingh , mas corrige o caso do arquivo.

Eu também entendo que a pergunta original era sobre um utilitário de linha de comando existente. Mas como essa parece ser a pergunta no para isso, incluindo scripts de shell que querem ter dependências mínimas, eu coloquei essa solução de script aqui, para que eu possa encontrá-la mais tarde :)


Esta não é uma resposta para a pergunta, mas para quem faz o script:

echo `cd "$1" 2>/dev/null&&pwd||(cd "$(dirname "$1")";pwd|sed "s|/*\$|/${1##*/}|")`

Ele manipula / .. ./ etc corretamente. Eu também parece trabalhar no OSX


Geralmente não existe o absolute path para um arquivo (essa afirmação significa que pode haver mais de um em geral, portanto, o uso do artigo definido não é apropriado). Um absolute path é qualquer caminho que inicie a partir da raiz "/" e designe um arquivo sem ambigüidade independentemente do diretório de trabalho (consulte, por exemplo, wikipedia ).

Um relative path é um caminho que deve ser interpretado a partir de outro diretório. Pode ser o diretório de trabalho se for um relative path sendo manipulado por um aplicativo (embora não necessariamente). Quando está em um link simbólico em um diretório, geralmente ele é relativo a esse diretório (embora o usuário possa ter outros usos em mente).

Portanto, um caminho absoluto é apenas um caminho relativo ao diretório raiz.

Um caminho (absoluto ou relativo) pode ou não conter links simbólicos. Se isso não ocorrer, também é um tanto impermeável a alterações na estrutura de vinculação, mas isso não é necessariamente necessário ou mesmo desejável. Algumas pessoas chamam canonical path (ou canonical file name ou resolved path ) um absolute path no qual todos os links simbólicos foram resolvidos, isto é, foram substituídos por um caminho para o qual eles se conectam. Os comandos realpath e readlink buscam um caminho canônico, mas somente o realpath tem uma opção para obter um caminho absoluto sem se preocupar em resolver links simbólicos (junto com várias outras opções para obter vários tipos de caminhos, absolutos ou relativos a algum diretório).

Isso exige várias observações:

  1. links simbólicos só podem ser resolvidos se o que eles devem linkar já estiver criado, o que obviamente nem sempre é o caso. Os comandos realpath e readlink têm opções para explicar isso.
  2. um diretório em um caminho pode mais tarde se tornar um link simbólico, o que significa que o caminho não é mais canonical . Portanto, o conceito depende do tempo (ou do ambiente).
  3. mesmo no caso ideal, quando todos os links simbólicos podem ser resolvidos, ainda pode haver mais de um canonical path para um arquivo, por dois motivos:
    • a partição que contém o arquivo pode ter sido montada simultaneamente ( ro ) em vários pontos de montagem.
    • pode haver hard links para o arquivo, significando essencialmente que o arquivo existe em vários diretórios diferentes.

Portanto, mesmo com a definição muito mais restritiva do canonical path , pode haver vários caminhos canônicos para um arquivo. Isso também significa que o qualificador canonical é um tanto inadequado, pois geralmente implica uma noção de exclusividade.

Isso expande uma breve discussão do tópico em uma resposta a outra pergunta semelhante no Bash: recuperar caminho absoluto dado relativo

Minha conclusão é que o realpath é melhor projetado e muito mais flexível que o readlink . O único uso do readlink que não é coberto pelo realpath é a chamada sem opção retornando o valor de um link simbólico.


O dogbane answer com a descrição que está chegando:

#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"

Explicação:

  1. Este script obtém o caminho relativo como argumento "$1"
  2. Então nós obtemos a parte do dirname desse caminho (você pode passar dir ou arquivo para este script): dirname "$1"
  3. Então nós cd "$(dirname "$1") neste diretório relativo e obtemos o caminho absoluto para ele executando o comando pwd shell
  4. Depois disso, acrescentamos basename ao caminho absoluto: $(basename "$1")
  5. Como passo final, fazemos echo

Para diretórios, o dirname é dirname para ../ e retorna ./ .

A função do nolan6000 pode ser modificada para corrigir isso:

get_abs_filename() {
  # $1 : relative filename
  if [ -d "${1%/*}" ]; then
    echo "$(cd ${1%/*}; pwd)/${1##*/}"
  fi
}

Se você não tem utilitários de readlink ou realpath, você pode usar a seguinte função que funciona em bash e zsh (não tenho certeza sobre o resto).

abspath () { case "$1" in /*)printf "%s\n" "$1";; *)printf "%s\n" "$PWD/$1";; esac; }

Isso também funciona para arquivos inexistentes (assim como a função python os.path.abspath ).

Infelizmente abspath ./../somefile não se livra dos pontos.


Tente o readlink que resolverá os links simbólicos:

readlink -e /foo/bar/baz

Uma alternativa para obter o caminho absoluto no Ruby :

realpath() {ruby -e "require 'Pathname'; puts Pathname.new('$1').realpath.to_s";}

Funciona sem argumentos (pasta atual) e arquivo relativo ou absoluto ou caminho de pasta como um argumento.


#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"

$ readlink -m FILE
/path/to/FILE

Isso é melhor que readlink -e FILE ou realpath , porque funciona mesmo que o arquivo não exista.





path