Bagaimana cara mendapatkan path lengkap file?

717

Apakah ada cara mudah saya dapat mencetak path lengkap file.txt?

file.txt = /nfs/an/disks/jj/home/dir/file.txt

Itu <command>

dir> <command> file.txt  

harus dicetak

/nfs/an/disks/jj/home/dir/file.txt
Jean
sumber

Jawaban:

1189

Gunakan tautan baca :

readlink -f file.txt
filmor
sumber
32
Untuk itulah '-f' diperuntukkan.
film atau
5
Baru diuji pada 10.9.2, berfungsi dengan baik. yang readlink / usr / local / opt / coreutils / libexec / gnubin / readlink readlink --version readlink (GNU coreutils) 8.22
J0hnG4lt
10
@ J0hnG4lt: itu karena Anda menginstal coreutils dengan homebrew dan mengubah PATH Anda untuk menunjuk ke binari yang tidak diperbaiki. Menginstal coreutils, meninggalkan PATH sendirian, dan menggunakan "greadlink" juga akan berfungsi.
Tim Smith
35
pada MAC: instal homebrew brew install coreutilslalugreadlink -f file.txt
To Kra
217

Saya kira Anda menggunakan Linux.

Saya menemukan sebuah utilitas bernama realpathcoreutils 8.15.

realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt

Sesuai komentar @ styrofoam-fly dan @ arch-standton, realpathsendirian tidak memeriksa keberadaan file, untuk menyelesaikan ini tambahkan eargumen:realpath -e file

lllllllllllll
sumber
Bekerja dengan cygwin (dengan permen 2.7.9)
Scrambo
1
realpathberkomitmen untuk repositori coreutils akhir 2011, rilis 8.15 dilakukan pada Januari 2012, saya menjawab pertanyaan (dengan readlinksaran) pada Maret 2011 :)
filmor
2
realpath tidak memeriksa keberadaan file, itu hanya menyelesaikan jalur. Meminta path lengkap dari file yang tidak ada harus menghasilkan kesalahan.
terbang styrofoam
4
@styrofoamfly realpath -emencetak kesalahan jika argumen tidak ada.
Arch Stanton
76

Berikut ini biasanya trik:

 echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
ZeRemz
sumber
Halo. Saya menemukan jawaban ini terbaik untuk kebutuhan saya. Bisakah Anda menjelaskan bagaimana saya bisa menggunakan variabel lokal daripada parameter baris perintah (yaitu $ 1)
deeJ
1
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
stiemannkj1
7
@SopalajodeArrierez Karena readlinktidak berfungsi jika file tersebut adalah symlink, ia akan menunjukkan kepada Anda target symlink daripada symlink itu sendiri.
qwertzguy
1
Saya suka ini, karena readlinkmembawa saya kembali ke dir induk tempat tautan simbolis dihasilkan, tetapi ini mengabaikannya.
Sukhi
set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") ### Output: / home / ravi / ..
Tom Hale
35

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
jcomeau_ictx
sumber
26
find $PWD -type f | grep "filename"

atau

find $PWD -type f -name "*filename*"
Anshul Gupta
sumber
1
Bagi saya, di mac, ini bekerja - bukan $ pwd -find `pwd` -type file -name \*.dmp
mrwaim
14

Jika Anda berada di direktori yang sama dengan file:

ls "`pwd`/file.txt"

Ganti file.txtdengan nama file target Anda.

Steven
sumber
9
Anda juga dapat melakukannyaecho $(pwd)/file.txt
Alex
12

Di Windows:

  • Memegang Shiftdan mengklik kanan pada file di Windows Explorer memberi Anda opsi yang disebut Copy as Path. Ini akan menyalin path lengkap file ke clipboard.

Di Linux:

  • Anda dapat menggunakan perintah realpath yourfileuntuk mendapatkan path lengkap file seperti yang disarankan oleh orang lain.
Natesh bhat
sumber
4

Saya tahu bahwa ini adalah pertanyaan lama sekarang, tetapi hanya untuk menambah informasi di sini:

Perintah Linux whichdapat 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/ .

Tuan Kucing
sumber
5
Jawaban ini terlalu spesifik, OP bukan tentang menemukan perintah.
AL
4

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.

Bhargav Srinivasan
sumber
mencetak path pwd saat ini
Sand1512
Ya, koma memisahkan path lengkap untuk semua file dalam pwd, untuk file lakukan saja 'nama file' bukan hanya 'ls'.
Bhargav Srinivasan
3

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

fpnbukan paket Linux standar, tetapi ini adalah proyek github gratis dan terbuka dan Anda dapat mengaturnya dalam satu menit .

Adam Matan
sumber
1
Secara umum, pwddengan sendirinya harus berjalan dengan baik di Linux dan sebagian besar lingkungan OS seperti Unix lainnya.
karolus
3

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
Ramu
sumber
2

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_dirakan berisi/home/abc/sandbox/v1/../../test

Ackq
sumber
memilih ini karena ini adalah yang termudah dan paling relevan. Namun jika Anda mengetik, ./test.cshAnda akan memiliki lintasan yang berakhir dengan/test/.
vinyll
2

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 FILEdan grealpath DIRECTORY.

Petunjuk cara menginstal coreutils / GNU Tools pada Mac OS X melalui Homebrew dapat ditemukan di Arktik StackExchange ini .

NB: Perintah readlink -fdan realpathharus bekerja di luar kotak untuk pengguna non-Mac Unix.

JacobWuzHere
sumber
2
brew install coreutils
Ke Kra
2
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

Ini adalah penjelasan tentang apa yang terjadi pada jawaban @ ZeRemz :

  1. Script ini mendapatkan path relatif sebagai argumen "$1"
  2. Kemudian kita mendapatkan bagian dirname dari jalur itu (Anda bisa mengirimkan dir atau file ke skrip ini):dirname "$1"
  3. Lalu kita cd "$(dirname "$1")ke dir relatif ini
  4. && pwd -Pdan dapatkan jalur absolut untuk itu. -POpsi akan menghindari semua symlink
  5. Setelah itu kita tambahkan nama samaran ke path absolut:$(basename "$1")
  6. Sebagai langkah terakhir kita echoitu
Eugen Konkov
sumber
1

Ini 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} \'
}
Russell Speight
sumber
1

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}
Andrew Miller
sumber
0

Biasanya:

find `pwd` | grep <filename>

Atau, hanya untuk folder saat ini:

find `pwd` -maxdepth 1 | grep <filename>
sja
sumber
hm kenapa benci?
sjas
0

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 filedari 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

Dave Rix
sumber
0

Anda dapat menyimpan ini di Anda shell.rcatau hanya memasukkannya ke konsol

function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"

contoh:

ap somefile.txt

akan menampilkan

/home/user/somefile.txt
Roman Rhrn Nesterov
sumber
3
Tapi kemudian ap ../foobar.txtakan memberi /home/user/../foobar.txt, yang umumnya tidak seperti yang Anda inginkan.
bdesham
2
Juga ap /tmp/foobar.txtakan memberi /home/user//tmp/foobar.txt, mana yang salah.
David Diberikan
-1
find / -samefile file.txt -print

Akan menemukan semua tautan ke file dengan nomor inode yang sama dengan file.txt

menambahkan -xdevbendera akan menghindari finduntuk melintasi batas perangkat ("mount points"). (Tapi ini mungkin tidak akan menyebabkan apa pun ditemukan jika findtidak memulai pada direktori pada perangkat yang sama seperti file.txt)

Perhatikan bahwa finddapat 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
wildplasser
sumber
-1

Ini akan berfungsi untuk file dan folder:

getAbsolutePath(){
    [[ -d $1 ]] && { cd "$1"; echo "$(pwd -P)"; } || 
    { cd "$(dirname "$1")" || exit 1; echo "$(pwd -P)/$(basename "$1")"; }
}
Jahid
sumber
-1

Ini bekerja dengan Linux dan Mac OSX ..

 echo $(pwd)$/$(ls file.txt)
Ahmed Abobakr
sumber
-1

Utilitas Linux lain, yang melakukan pekerjaan ini:

fname <file>
BluVio
sumber
-1

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.

Richard Sharpe
sumber
-1

Di mac yang disebutkan di bawah ini bekerja. Tidak perlu menambahkan garis mewah.

> pwd filename
Sanjeet kumar
sumber
6
Tidak hanya mencetak direktori kerja (tanpa nama file) seperti yang disarankan oleh nama perintahprint working directory
anilbey
-2
fp () {
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$1
echo $RESULT | pbcopy
echo $RESULT
}

Menyalin teks ke clipboard Anda dan menampilkan teks di jendela terminal.

:)

(Saya menyalin beberapa kode dari jawaban stack overflow lain tetapi tidak dapat menemukan jawaban itu lagi)

Dhruv
sumber
-2

cara termudah yang saya temukan adalah

for i in `ls`; do echo "`pwd`/$i"; done

ini bekerja dengan baik untuk saya

onkar
sumber
-2

Di Mac OSX, lakukan langkah-langkah berikut:

  1. cd ke dalam direktori file target.
  2. Ketikkan salah satu dari perintah terminal berikut.
Terminal
ls "`pwd`/file.txt"
echo $(pwd)/file.txt
  1. Ganti file.txtdengan nama file Anda yang sebenarnya.
  2. tekan Enter
Biarkan Saya Tink Tentang Ini
sumber
-3

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 -fperintah adalah yang benar.

Andrew_1510
sumber
-3

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
Nestor Urquiza
sumber