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

Jawaban:


1189

Gunakan tautan baca :

readlink -f file.txt

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


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")

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

26
find $PWD -type f | grep "filename"

atau

find $PWD -type f -name "*filename*"

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.


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.


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.


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 .


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

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


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.


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

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} \'
}

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}

0

Biasanya:

find `pwd` | grep <filename>

Atau, hanya untuk folder saat ini:

find `pwd` -maxdepth 1 | grep <filename>

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


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

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

-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")"; }
}


-1

Utilitas Linux lain, yang melakukan pekerjaan ini:

fname <file>

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


-1

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

> pwd filename

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)


-2

cara termudah yang saya temukan adalah

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

ini bekerja dengan baik untuk saya


-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

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


-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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.