Î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)
Încearcă-ului căilor`.
$ realpath example.txt
/home/username/example.txt
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")
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.
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.
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ă.
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
}
Această cale relativă la cale absolută converter shell funcția
..
și .
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 :)
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.
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
Din păcate
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) o
cale absolută, în care toate link-uri simbolice au fost rezolvate, adică au fost înlocuite de o cale de a whetever se leagă de ele. Comenzile
ului 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:
ului căilor " și " readlink
au opțiuni pentru a ține cont de asta.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 de
ului căilor` e apel fără opțiune întoarce valoarea unui link simbolic.
Anii dogbane
răspunde cu descrierea a ceea ce va veni pe:
#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"
Explicație:
"$1"
dirname "$1"
ul "$(dirname "$1") în acest raport dir și de a lua calea absolută pentru că prin rularea
pwd` comanda shell$(basename "$1")
echo
acestaPentru 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
}
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
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ă.
O alternativă pentru a obține calea absolută în Rubin:
ului căilor() {ruby -e "impun 'Cale'; pune Pathname.noi('$1').căilor.to_s";}
Funcționează cu nici un argument (directorul curent) și relative și absolute fișier sau folder calea ca agument.
#! /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.
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ă.