Jawaban:
Gunakan tautan baca :
readlink -f file.txt
brew install coreutils
lalugreadlink -f file.txt
Saya kira Anda menggunakan Linux.
Saya menemukan sebuah utilitas bernama realpath
coreutils 8.15.
realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt
Sesuai komentar @ styrofoam-fly dan @ arch-standton, realpath
sendirian tidak memeriksa keberadaan file, untuk menyelesaikan ini tambahkan e
argumen:realpath -e file
realpath
berkomitmen untuk repositori coreutils akhir 2011, rilis 8.15 dilakukan pada Januari 2012, saya menjawab pertanyaan (dengan readlink
saran) pada Maret 2011 :)
realpath -e
mencetak kesalahan jika argumen tidak ada.
Berikut ini biasanya trik:
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
tidak berfungsi jika file tersebut adalah symlink, ia akan menunjukkan kepada Anda target symlink daripada symlink itu sendiri.
readlink
membawa saya kembali ke dir induk tempat tautan simbolis dihasilkan, tetapi ini mengabaikannya.
set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
### Output: / home / ravi / ..
Saya tahu ada cara yang lebih mudah untuk ini, tetapi terkutuk jika saya dapat menemukannya ...
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"
atau
find $PWD -type f -name "*filename*"
find `pwd` -type file -name \*.dmp
Shift
dan mengklik kanan pada file di Windows Explorer memberi Anda opsi yang disebut Copy as Path
. Ini akan menyalin path lengkap file ke clipboard.realpath yourfile
untuk mendapatkan path lengkap file seperti yang disarankan oleh orang lain.Saya tahu bahwa ini adalah pertanyaan lama sekarang, tetapi hanya untuk menambah informasi di sini:
Perintah Linux which
dapat digunakan untuk menemukan filepath dari file perintah, yaitu
$ which ls
/bin/ls
Ada beberapa peringatan untuk ini; silakan lihat https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .
Bekerja di Mac, Linux, * nix:
Ini akan memberi Anda csv yang dikutip dari semua file dalam direktori saat ini:
ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'
Output ini dapat dengan mudah disalin ke dalam daftar python atau struktur data serupa.
Anda dapat menggunakan skrip fpn (nama path lengkap) :
% 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
bukan paket Linux standar, tetapi ini adalah proyek github gratis dan terbuka dan Anda dapat mengaturnya dalam satu menit .
pwd
dengan sendirinya harus berjalan dengan baik di Linux dan sebagian besar lingkungan OS seperti Unix lainnya.
Anda dapat menggunakan fungsi ini. Jika nama file diberikan tanpa jalur relatif, maka diasumsikan ada di direktori kerja saat ini:
abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }
Pemakaian:
$ abspath file.txt
/I/am/in/present/dir/file.txt
Penggunaan dengan jalur relatif:
$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt
Dengan spasi dalam nama file:
$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt
Dalam skenario yang sama, saya meluncurkan skrip cshell dari beberapa lokasi lain. Untuk mengatur jalur absolut yang benar dari skrip sehingga hanya berjalan di direktori yang ditentukan, saya menggunakan kode berikut:
set script_dir = `pwd`/`dirname $0`
$0
menyimpan string yang tepat bagaimana skrip dieksekusi.
Untuk misalnya jika skrip diluncurkan seperti ini: $> ../../test/test.csh
,
$script_dir
akan berisi/home/abc/sandbox/v1/../../test
./test.csh
Anda akan memiliki lintasan yang berakhir dengan/test/.
Untuk Mac OS X, saya mengganti utilitas yang datang dengan sistem operasi dan menggantinya dengan versi coreutils yang lebih baru. Ini memungkinkan Anda untuk mengakses alat-alat seperti readlink -f
(untuk jalur absolut ke file) dan realpath
(jalur absolut ke direktori) di Mac Anda.
Versi Homebrew menambahkan 'G' (untuk Alat GNU) di depan nama perintah - sehingga padanannya menjadi greadlink -f FILE
dan grealpath DIRECTORY
.
Petunjuk cara menginstal coreutils / GNU Tools pada Mac OS X melalui Homebrew dapat ditemukan di Arktik StackExchange ini .
NB: Perintah readlink -f
dan realpath
harus bekerja di luar kotak untuk pengguna non-Mac Unix.
brew install coreutils
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
Ini adalah penjelasan tentang apa yang terjadi pada jawaban @ ZeRemz :
"$1"
dirname "$1"
cd "$(dirname "$1")
ke dir relatif ini&& pwd -P
dan dapatkan jalur absolut untuk itu. -P
Opsi akan menghindari semua symlink$(basename "$1")
echo
ituIni bekerja cukup baik untuk saya. Itu tidak bergantung pada sistem file (pro / con tergantung pada kebutuhan) jadi itu akan cepat; dan, itu harus portabel untuk hampir semua * NIX. Itu menganggap string yang diteruskan memang relatif terhadap PWD dan bukan direktori lain.
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} \'
}
Ini naif, tapi saya harus membuatnya agar sesuai dengan POSIX. Membutuhkan izin untuk masuk ke direktori file.
#!/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}
Saya suka banyak jawaban yang sudah diberikan, tetapi saya merasa ini sangat berguna, terutama di dalam skrip untuk mendapatkan path lengkap file, termasuk mengikuti symlink dan referensi relatif seperti .
dan..
dirname `readlink -e relative/path/to/file`
Yang akan mengembalikan path lengkap dari file
dari path root dan seterusnya. Ini dapat digunakan dalam skrip sehingga skrip tahu dari mana ia menjalankan jalurnya, yang berguna dalam klon repositori yang dapat ditemukan di mana saja pada mesin.
basePath=`dirname \`readlink -e $0\``
Saya kemudian dapat menggunakan ${basePath}
variabel dalam skrip saya untuk secara langsung referensi skrip lain.
Semoga ini membantu,
Dave
Anda dapat menyimpan ini di Anda shell.rc
atau hanya memasukkannya ke konsol
function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"
contoh:
ap somefile.txt
akan menampilkan
/home/user/somefile.txt
ap ../foobar.txt
akan memberi /home/user/../foobar.txt
, yang umumnya tidak seperti yang Anda inginkan.
ap /tmp/foobar.txt
akan memberi /home/user//tmp/foobar.txt
, mana yang salah.
find / -samefile file.txt -print
Akan menemukan semua tautan ke file dengan nomor inode yang sama dengan file.txt
menambahkan -xdev
bendera akan menghindari find
untuk melintasi batas perangkat ("mount points"). (Tapi ini mungkin tidak akan menyebabkan apa pun ditemukan jika find
tidak memulai pada direktori pada perangkat yang sama seperti file.txt
)
Perhatikan bahwa find
dapat melaporkan beberapa jalur untuk objek sistem file tunggal, karena sebuah Inode dapat ditautkan oleh lebih dari satu entri direktori, bahkan mungkin menggunakan nama yang berbeda. Contohnya:
find /bin -samefile /bin/gunzip -ls
Akan menghasilkan:
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
Ini bekerja dengan Linux dan Mac OSX ..
echo $(pwd)$/$(ls file.txt)
Untuk Mac OS, jika Anda hanya ingin mendapatkan jalur file di finder, kontrol klik file tersebut, dan gulir ke bawah ke "Layanan" di bagian bawah. Anda mendapatkan banyak pilihan, termasuk "salin jalur" dan "salin jalur lengkap". Mengklik pada salah satu dari ini akan meletakkan path di clipboard.
Di mac yang disebutkan di bawah ini bekerja. Tidak perlu menambahkan garis mewah.
> pwd filename
print working directory
Di Mac OSX, lakukan langkah-langkah berikut:
cd
ke dalam direktori file target.ls "`pwd`/file.txt"
echo $(pwd)/file.txt
file.txt
dengan nama file Anda yang sebenarnya.Di samping "readlink -f", perintah lain yang umum digunakan:
$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 $
Ini juga memberikan path lengkap dan nama file di konsol
Di luar topik: Metode ini hanya memberikan tautan relatif , bukan absolut. The readlink -f
perintah adalah yang benar.
Buat fungsi seperti di bawah ini (gema jalur absolut file dengan pwd dan tambahkan file di akhir jalur:
abspath() { echo $(pwd "$1")/"$1"; }
Sekarang Anda bisa menemukan jalur file apa saja:
abspath myfile.ext