kzen.dev
  • Întrebări
  • Tag-uri
  • Utilizatori
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
 dhardy
dhardy
Question

bash/pește comandă pentru a imprima absolut calea către un fișier

Întrebare: există un simplu sh/bash/zsh/pește/... comandă pentru a imprima calea absolută de orice fișier-l hrănesc?

Caz de utilizare: - am'm in directorul /o/b și m-am'd place să imprimați calea completă la fișierul " c " pe linia de comandă, astfel încât să pot lipi cu ușurință într-un alt program: /a/b/c. Simplu, dar un mic program pentru a face acest lucru ar putea salva, probabil, mi-5 sau atât de secunde, atunci când vine vorba de manipulare căi lungi, care în final se adaugă. Așa că mă surprinde că nu pot't găsi un standard de utilitate pentru a face acest lucru — există într-adevăr nici unul?

Aici's un exemplu de implementare, 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)
400 2010-10-12T13:12:09+00:00 18
Programare
path
shell
bash
Solution / Answer
Benjamin Bannier
Benjamin Bannier
12 octombrie 2010 в 1:16
2010-10-12T13:16:11+00:00
Mai mult
Sursă
Editează
#11169276

Încearcă-ului căilor`.

$ realpath example.txt
/home/username/example.txt
Benjamin Bannier
Benjamin Bannier
Răspuns editat 18 octombrie 2018 в 10:35
485
0
Aveți o întrebare? Adăugați-o pe site-ul nostru și primiți răspuns instant
ro.kzen.dev
Dennis Williamson
Dennis Williamson
12 octombrie 2010 в 2:34
2010-10-12T14:34:06+00:00
Mai mult
Sursă
Editează
#11169278

Încerca readlink care va rezolva simbolic link-uri:

readlink -e /foo/bar/baz
300
0
Aveți o întrebare? Adăugați-o pe site-ul nostru și primiți răspuns instant
ro.kzen.dev
 dogbane
dogbane
12 octombrie 2010 в 1:51
2010-10-12T13:51:38+00:00
Mai mult
Sursă
Editează
#11169277
#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"
James Bedford
James Bedford
Răspuns editat 9 noiembrie 2018 в 2:52
240
0
 peterh
peterh
17 ianuarie 2014 в 2:24
2014-01-17T14:24:12+00:00
Mai mult
Sursă
Editează
#11169285

Uita `readlink " și " căilor care pot sau nu pot fi instalate pe sistemul dumneavoastră.

Extinderea pe dogbane's răspuns de mai sus aici este exprimată ca o funcție:

#!/bin/bash
get_abs_filename() {
  # $1 : relative filename
  echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
}

puteți apoi utiliza ca aceasta:

myabsfile=$(get_abs_filename "../../foo/bar/file.txt")

Cum și de ce funcționează?

Soluția exploatează faptul că Bash built-in pwd comanda va imprima calea absolută a directorului curent atunci când este invocată fără argumente.

De ce îmi place această soluție ?

Este portabil și nu't nevoie de nici readlink " sau " căilor care de multe ori nu există într-o instalare implicită a unui anumit Linux/Unix distro.

Dacă dir nu't există?

Ca mai sus funcția va eșua și de imprimare pe stderr dacă calea de director dat nu există. Acest lucru nu poate fi ceea ce vrei. De asemenea, puteți extinde funcția să se ocupe de această situație:

#!/bin/bash
get_abs_filename() {
  # $1 : relative filename
  if [ -d "$(dirname "$1")" ]; then
    echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
  fi
}

Acum se va întoarce un șir gol dacă o mamă dirs nu există.

Cum te descurci cu trailing '..' sau '.' la intrare ?

Ei bine, ea nu da o cale absolută în acest caz, dar nu și una minimă. Se va arata ca:

/Users/bob/Documents/..

Dacă doriți pentru a rezolva '..' veți avea nevoie pentru a face script-ul, cum ar fi:

get_abs_filename() {
  # $1 : relative filename
  filename=$1
  parentdir=$(dirname "${filename}")

  if [ -d "${filename}" ]; then
      echo "$(cd "${filename}" && pwd)"
  elif [ -d "${parentdir}" ]; then
    echo "$(cd "${parentdir}" && pwd)/$(basename "${filename}")"
  fi
}
 peterh
peterh
Răspuns editat 24 august 2017 в 8:55
77
0
Aveți o întrebare? Adăugați-o pe site-ul nostru și primiți răspuns instant
ro.kzen.dev
 Flimm
Flimm
27 februarie 2013 в 5:04
2013-02-27T17:04:26+00:00
Mai mult
Sursă
Editează
#11169282
$ readlink -m FILE
/path/to/FILE

Acest lucru este mai bună decât readlink -e de FIȘIER " sau " căilor, pentru că acesta funcționează chiar dacă fișierul nu't există.

74
0
Alexander Klimetschek
Alexander Klimetschek
11 aprilie 2014 в 2:12
2014-04-11T02:12:23+00:00
Mai mult
Sursă
Editează
#11169287

Această cale relativă la cale absolută converter shell funcția

  • nu necesită utilități (doar pentru cd " și " pwd`)
  • lucrări de directoare și fișiere
  • mânere .. și .
  • se ocupă spații în dir sau nume de fișiere
  • necesită acel fișier sau director există
  • returnează nimic, dacă nu există nimic la cale
  • mânere căi absolute ca intrare (trece-le prin esență)

Cod:

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
}

Eșantion:

# 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

Notă: Aceasta este bazată pe răspunsurile la nolan6000](https://stackoverflow.com/a/21188136/923794) și bsingh, dar stabilește fișierul caz.

De asemenea, am înțeles că întrebarea era despre un existent utilitar de linie de comandă. Dar din moment ce aceasta pare să fie întrebarea pe stackoverflow pentru că inclusiv shell script-uri care doresc să aibă minim dependențele, am pus acest script soluție aici, așa că am putea găsi mai târziu :)

Alexander Klimetschek
Alexander Klimetschek
Răspuns editat 20 octombrie 2017 в 8:48
64
0
Aveți o întrebare? Adăugați-o pe site-ul nostru și primiți răspuns instant
ro.kzen.dev
 lessthanideal
lessthanideal
12 octombrie 2011 в 4:26
2011-10-12T16:26:49+00:00
Mai mult
Sursă
Editează
#11169280

A "găsi" comanda poate ajuta

find $PWD -name ex*
find $PWD -name example.log

Listează toate fișierele în sau sub actualul director cu nume de potrivire de model. Puteți simplifica dacă veți primi doar câteva rezultate (de exemplu, directorul partea de jos din copac care conține câteva fișiere), doar

find $PWD

Eu folosesc asta pe Solaris 10, care nu't au alte utilități menționat.

23
0
 hluk
hluk
12 octombrie 2010 в 2:59
2010-10-12T14:59:46+00:00
Mai mult
Sursă
Editează
#11169279

Dacă tu nu't au readlink sau căilor de utilități decât vă puteți folosi următoarea funcție care funcționează în bash și zsh (nu sunt sigur despre restul).

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

Acest lucru, de asemenea, funcționează pentru fișiere inexistente (la fel ca python funcția sistem de operare.calea.abspath).

Din păcate abspath ./../somefile nu't a scăpa de puncte.

15
0
Aveți o întrebare? Adăugați-o pe site-ul nostru și primiți răspuns instant
ro.kzen.dev
 wjv
wjv
24 septembrie 2012 в 1:59
2012-09-24T13:59:37+00:00
Mai mult
Sursă
Editează
#11169281

Aici's o zsh-singura funcție care îmi place pentru compact. Foloseste " A " expansiune modificator — a se vedea zshexpn(1).

realpath() { for f in "$@"; do echo ${f}(:A); done }
9
0
 babou
babou
19 mai 2013 в 5:40
2013-05-19T17:40:57+00:00
Mai mult
Sursă
Editează
#11169284

Există, în general, nu există un astfel de lucru ca de cale absolută într-un fișier (această declarație înseamnă că pot exista mai mult de unul, în general, prin urmare, utilizarea articolului hotărât la** nu este adecvat). O cale absolută este orice cale care începe de la rădăcină "/" și desemnează un fișier fără ambiguitate independent de directorul de lucru.(a se vedea de exemplu wikipedia).

O cale relativă este o cale care este de a fi interpretate pornind de la un alt director. Acesta poate fi directorul de lucru, dacă este o cale relativă a fi manipulat de o aplicație (deși nu neapărat). Atunci când este într-o legătură simbolică într-un director, este, în general, destinate a fi relativ la acel director (deși utilizatorul poate avea și alte utilizări în minte).

Prin urmare, o cale absolută este doar o cale relativă la directorul rădăcină.

O cale (absolută sau relativă) poate sau nu poate conține link-uri simbolice. Dacă nu, este, de asemenea, oarecum insensibil la modificările în structură care leagă, dar acest lucru nu este neapărat necesar sau chiar de dorit. Unii oameni numesc canonice calea "(sau "canonice nume de fișier" sau " rezolvate calea) ocale absolută, în care toate link-uri simbolice au fost rezolvate, adică au fost înlocuite de o cale de a whetever se leagă de ele. Comenzileului căilor " și " readlink ambele uita-te pentru un canonic cale, dar numai pentru căilor` are o opțiune pentru a obține o cale absolută fără a se deranja să rezolve link-uri simbolice (împreună cu alte câteva opțiuni pentru a obține diferite tipuri de trasee, absolută sau relativă la unele directory).

Acest lucru necesită câteva observații:

  1. link-uri simbolice pot fi rezolvate numai dacă oricare ar fi acestea ar trebui să link-ul este deja creat, care este, evident, nu este întotdeauna cazul. Comenzile ului căilor " și " readlink au opțiuni pentru a ține cont de asta.
  2. un director de pe o cale poate deveni mai târziu o legătură simbolică, ceea ce înseamnă că drumul nu mai este "canonic". Prin urmare, conceptul este dată (sau de mediu) dependente.
  3. chiar și în cazul ideal, când toate link-uri simbolice pot fi rezolvate, poate că mai există încă mai mult de un `canonic calea unui fișier, pentru două motive:
  • partiția care conține fișierul poate au fost montate simultan ("ro") pe mai multe puncte de montare.
  • pot exista link-uri hard la dosar, adică, în esență, fișierul există în mai multe directoare diferite.

Prin urmare, chiar și cu mult mai restrictive definiția canonică calea`, pot exista mai multe canonice căi într-un fișier. Acest lucru înseamnă, de asemenea, că calificativul "canonic" este oarecum inadecvat, deoarece, de obicei, implică o noțiune de unicitate.

Acest lucru se extinde o scurtă discuție a subiectului într-un răspuns la o altă întrebare similară la https://stackoverflow.com/questions/4175264/retrieve-absolute-path-given-relative-linux-shell#16614764

Concluzia mea este ca ului căilor este mai bine conceput și mult mai flexibil decât readlink. Numai utilizarea de readlinkcare nu este acoperit deului căilor` e apel fără opțiune întoarce valoarea unui link simbolic.

 Community
Community
Răspuns editat 23 mai 2017 в 12:34
7
0
Aveți o întrebare? Adăugați-o pe site-ul nostru și primiți răspuns instant
ro.kzen.dev
Eugen Konkov
Eugen Konkov
20 mai 2017 в 10:03
2017-05-20T10:03:02+00:00
Mai mult
Sursă
Editează
#11169294

Anii dogbane răspunde cu descrierea a ceea ce va veni pe:

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

Explicație:

  1. Acest script a obține cale relativă ca argument "$1"
  2. Atunci vom obține dirname o parte din calea asta (puteți trece fie dir sau fișier cu acest script): dirname "$1"
  3. Apoi am cd ul "$(dirname "$1") în acest raport dir și de a lua calea absolută pentru că prin rulareapwd` comanda shell
  4. După care am adăuga basename pentru calea absolută: $(basename "$1")
  5. Ca pas final ne echo acesta
 Community
Community
Răspuns editat 23 mai 2017 в 12:10
4
0
 bsingh
bsingh
21 martie 2014 в 7:13
2014-03-21T07:13:49+00:00
Mai mult
Sursă
Editează
#11169286

Pentru directoare dirname s-a împiedicat de../și se întoarce./`.

nolan6000's function pot fi modificate pentru a repara asta:

get_abs_filename() {
  # $1 : relative filename
  if [ -d "${1%/*}" ]; then
    echo "$(cd ${1%/*}; pwd)/${1##*/}"
  fi
}
2
0
Aveți o întrebare? Adăugați-o pe site-ul nostru și primiți răspuns instant
ro.kzen.dev
 Alek
Alek
16 martie 2016 в 6:57
2016-03-16T18:57:03+00:00
Mai mult
Sursă
Editează
#11169291

Acest lucru nu este un răspuns la întrebare, dar pentru cei care nu scripting:

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

acesta se ocupă de / .. ./ etc corect. Am, de asemenea, pare să funcționeze pe OSX

2
0
 fred.johnsen
fred.johnsen
21 august 2016 в 5:50
2016-08-21T05:50:28+00:00
Mai mult
Sursă
Editează
#11169292

Am plasat următorul script pe sistemul meu & am sunat-o ca un bash alias pentru când vreau să apuca repede calea completă către un fișier în directorul curent:

#!/bin/bash
/usr/bin/find "$PWD" -maxdepth 1 -mindepth 1 -name "$1"

Nu sunt sigur de ce, dar, pe OS X atunci când este solicitat de un script "$PWD" se extinde la cale absolută. Atunci când comanda este numit pe linia de comandă, nu't. Dar nu ceea ce vreau... bucurați-vă.

2
0
Aveți o întrebare? Adăugați-o pe site-ul nostru și primiți răspuns instant
ro.kzen.dev
 Atika
Atika
10 ianuarie 2017 в 4:16
2017-01-10T16:16:06+00:00
Mai mult
Sursă
Editează
#11169293

O alternativă pentru a obține calea absolută în Rubin:

ului căilor() {ruby -e "impun &#39;Cale&#39;; pune Pathname.noi(&#39;$1&#39;).căilor.to_s";}

Funcționează cu nici un argument (directorul curent) și relative și absolute fișier sau folder calea ca agument.

1
0
 ShellFish
ShellFish
19 aprilie 2014 в 2:38
2014-04-19T02:38:22+00:00
Mai mult
Sursă
Editează
#11169288
#! /bin/bash

file="$@"
realpath "$file" 2>/dev/null || eval realpath $(echo $file | sed 's/ /\\ /g')

Acest lucru face pentru deficiențele de ului căilor, depozitați-l într-un shell script fullpath. Acum puteți apela la:

$ cd && touch a\ a && rm A 2>/dev/null 
$ fullpath "a a"
/home/user/a a
$ fullpath ~/a\ a
/home/user/a a
$ fullpath A
A: No such file or directory.
1
0
Aveți o întrebare? Adăugați-o pe site-ul nostru și primiți răspuns instant
ro.kzen.dev
 Arj
Arj
24 octombrie 2019 в 10:54
2019-10-24T10:54:28+00:00
Mai mult
Sursă
Editează
#11169295

Cel mai simplu, dacă doriți să utilizați numai builtins este, probabil:

găsi `pwd` -numele fisierului

Numai un plus de două cuvinte de tip, și aceasta va funcționa pe toate sistemele unix, precum și OSX.

0
0
 icyyd
icyyd
5 decembrie 2014 в 12:01
2014-12-05T12:01:05+00:00
Mai mult
Sursă
Editează
#11169290

Hei baieti stiu ca nu's un thread vechi dar eu sunt doar postarea asta pentru trimitere la cineva care a vizitat acest lucru ca mine. Dacă am înțeles corect la întrebare, cred că a localiza $filename comanda. Se afișează calea absolută a fișierului furnizate, dar numai dacă acesta există.

-1
0
Aveți o întrebare? Adăugați-o pe site-ul nostru și primiți răspuns instant
ro.kzen.dev
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
Utilizatori
Toate
Nou
Populare
1
Andrei Kalinin
Înregistrat 2 săptămâni în urmă
2
Koroleva Ego
Înregistrat 1 lună în urmă
3
Star Lenon
Înregistrat 1 lună în urmă
4
Данил Жевнеров
Înregistrat 1 lună în urmă
5
Анна Литвиненко
Înregistrat 2 luni în urmă
Aveți o întrebare? Adăugați-o pe site-ul nostru și primiți răspuns instant
ro.kzen.dev
DE
ES
ID
JA
NO
PT
RO
TR
ZH
© kzen.dev 2023
Sursă
stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire