Làm thế nào để có được đường dẫn đầy đủ của một tập tin?


717

Có cách nào dễ dàng để tôi có thể in đường dẫn đầy đủ file.txtkhông?

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

Các <command>

dir> <command> file.txt  

nên in

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

Câu trả lời:


1188

Sử dụng readlink :

readlink -f file.txt

32
Đó là những gì '-f' dành cho.
phim


5
Chỉ cần thử nghiệm vào ngày 10.9.2, hoạt động tốt. mà readlink / usr / local / opt / coreutils / libexec / gnubin / readlink readlink - chuyển đổi readlink (GNU coreutils) 8.22
J0hnG4lt

10
@ J0hnG4lt: đó là vì bạn đã cài đặt coreutils với homebrew và thay đổi PATH của bạn để trỏ đến các nhị phân chưa được trộn. Cài đặt coreutils, để PATH một mình và sử dụng "greadlink" cũng sẽ hoạt động tốt.
Tim Smith

35
trên MAC: sau brew install coreutilsđó cài đặt homebrewgreadlink -f file.txt
Đến Kra

217

Tôi cho rằng bạn đang sử dụng Linux.

Tôi tìm thấy một tiện ích được gọi là realpathtrong coreutils 8.15.

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

Theo nhận xét của @ styrofoam-fly và @ arch-standton, realpathmột mình không kiểm tra sự tồn tại của tệp, để giải quyết vấn đề này, thêm eđối số:realpath -e file


Hoạt động với cygwin (với mintty 2.7.9)
Scrambo

1
realpathđã cam kết với reput coreutils cuối năm 2011, phát hành 8.15 được thực hiện vào tháng 1 năm 2012, tôi đã trả lời câu hỏi (với readlinkgợi ý) vào tháng 3 năm 2011 :)
phim

2
realpath không kiểm tra sự tồn tại của tập tin, nó chỉ giải quyết các đường dẫn. Yêu cầu một đường dẫn đầy đủ của một tệp không tồn tại sẽ dẫn đến một lỗi.
xốp bay

4
@styrofoamfly realpath -ein lỗi nếu đối số không tồn tại.
Arch Stanton

76

Sau đây thường thực hiện các mẹo:

 echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

Xin chào. Tôi tìm thấy câu trả lời này tốt nhất cho yêu cầu của tôi. Bạn có thể giải thích làm thế nào tôi có thể sử dụng một biến cục bộ thay vì tham số dòng lệnh (ví dụ $ 1)
deeJ

1
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
stiemannkj1

7
@SopalajodeArrierez Vì readlinkkhông hoạt động nếu tệp là một liên kết tượng trưng, ​​nó sẽ hiển thị cho bạn mục tiêu của liên kết tượng trưng thay vì chính liên kết tượng trưng.
qwertzguy

1
Tôi thích điều này, bởi vì readlinkđưa tôi trở lại thư mục gốc nơi liên kết tượng trưng tạo ra, nhưng điều này bỏ qua nó.
Sukhi

set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") ### Kết quả: / home / ravi / ..
Tom Hale

35

Tôi biết có một cách dễ dàng hơn thế này, nhưng thật đáng kinh ngạc nếu tôi có thể tìm thấy nó ...

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"

hoặc là

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

1
Đối với tôi, trên mac, điều này đã hoạt động - thay vì $ pwd -find `pwd` -type file -name \*.dmp
mrwaim

14

Nếu bạn ở cùng thư mục với tệp:

ls "`pwd`/file.txt"

Thay thế file.txtbằng tên tệp mục tiêu của bạn.


9
bạn cũng có thể làmecho $(pwd)/file.txt
Alex

12

Trên Windows:

  • Giữ Shiftvà nhấp chuột phải vào một tệp trong Windows Explorer cung cấp cho bạn một tùy chọn được gọi Copy as Path. Điều này sẽ sao chép đường dẫn đầy đủ của tập tin vào clipboard.

Trên Linux:

  • Bạn có thể sử dụng lệnh realpath yourfileđể có được đường dẫn đầy đủ của tệp theo đề xuất của người khác.

4

Tôi biết rằng đây là một câu hỏi cũ, nhưng chỉ để thêm vào thông tin ở đây:

Lệnh Linux whichcó thể được sử dụng để tìm filepath của tệp lệnh, nghĩa là

$ which ls
/bin/ls

Có một số hãy cẩn thận với điều này; vui lòng xem https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .


5
Câu trả lời này quá cụ thể, OP không phải là về việc tìm kiếm các lệnh.
AL

4

Hoạt động trên Mac, Linux, * nix:

Điều này sẽ cung cấp cho bạn một csv được trích dẫn của tất cả các tệp trong thư mục hiện tại:

ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'

Đầu ra của điều này có thể dễ dàng được sao chép vào một danh sách python hoặc bất kỳ cấu trúc dữ liệu tương tự.


in đường dẫn pwd hiện tại
Sand1512

Có, dấu phẩy được phân tách đầy đủ đường dẫn cho tất cả các tệp trong pwd, đối với một tệp chỉ cần thực hiện ls 'tên tệp' thay vì chỉ 'ls'.
Bhargav Srinivasan

3

Bạn có thể sử dụng tập lệnh fpn (tên đường dẫn đầy đủ) :

% 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

fpnkhông phải là một gói Linux tiêu chuẩn, nhưng nó là một dự án github miễn phí và mở và bạn có thể thiết lập nó trong một phút .


1
Nói chung, pwdbản thân nó sẽ chạy tốt trên Linux và hầu hết các môi trường HĐH giống Unix khác.
karolus

3

Bạn có thể sử dụng chức năng này. Nếu tên tệp được đưa ra mà không có đường dẫn tương đối, thì nó được giả sử là có trong thư mục làm việc hiện tại:

abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }

Sử dụng:

$ abspath file.txt
/I/am/in/present/dir/file.txt

Sử dụng với đường dẫn tương đối:

$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt

Với khoảng trắng trong tên tệp:

$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt

2

Trong một kịch bản tương tự, tôi sẽ khởi chạy một tập lệnh cshell từ một số vị trí khác. Để đặt đường dẫn tuyệt đối chính xác của tập lệnh để nó chỉ chạy trong thư mục được chỉ định, tôi đang sử dụng đoạn mã sau:

set script_dir = `pwd`/`dirname $0`

$0 lưu trữ chuỗi chính xác cách tập lệnh được thực thi.

Ví dụ: nếu tập lệnh được khởi chạy như thế này : $> ../../test/test.csh, $script_dirsẽ chứa/home/abc/sandbox/v1/../../test


đã bình chọn cho điều này vì đây là cách dễ nhất và phù hợp nhất. Tuy nhiên, nếu bạn nhập, ./test.cshbạn sẽ có một đường dẫn kết thúc bằng/test/.
vinyll

2

Đối với Mac OS X, tôi đã thay thế các tiện ích đi kèm với hệ điều hành và thay thế chúng bằng phiên bản lõi mới hơn. Điều này cho phép bạn truy cập các công cụ như readlink -f(đối với đường dẫn tuyệt đối đến tệp) và realpath(đường dẫn tuyệt đối đến thư mục) trên máy Mac của bạn.

Phiên bản Homebrew gắn thêm 'G' (cho Công cụ GNU) trước tên lệnh - vì vậy các tương đương trở thành greadlink -f FILEgrealpath DIRECTORY.

Hướng dẫn về cách cài đặt coreutils / GNU Tools trên Mac OS X thông qua Homebrew có thể được tìm thấy trong arcticle StackExchange này .

NB: Các lệnh readlink -frealpathlệnh sẽ hoạt động tốt cho người dùng Unix không phải Mac.


2
brew install coreutils
Tới Kra

2
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

Đây là lời giải thích về những gì đang diễn ra tại câu trả lời của @ ZeRemz :

  1. Kịch bản này lấy đường dẫn tương đối làm đối số "$1"
  2. Sau đó, chúng tôi nhận được phần dirname của đường dẫn đó (bạn có thể chuyển dir hoặc tệp vào tập lệnh này):dirname "$1"
  3. Sau đó, chúng tôi cd "$(dirname "$1")vào dir tương đối này
  4. && pwd -Pvà có được đường dẫn tuyệt đối cho nó. -Ptùy chọn sẽ tránh tất cả các liên kết tượng trưng
  5. Sau đó, chúng tôi nối tên cơ sở vào đường dẫn tuyệt đối:$(basename "$1")
  6. Như bước cuối cùng chúng ta echo

1

Điều này làm việc khá tốt cho tôi. Nó không phụ thuộc vào hệ thống tập tin (pro / con tùy theo nhu cầu) nên sẽ nhanh chóng; và, nó nên có thể mang theo hầu hết mọi * NIX. Nó không cho rằng chuỗi đã truyền thực sự liên quan đến PWD chứ không phải một số thư mục khác.

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

Điều này là ngây thơ, nhưng tôi đã phải làm cho nó tuân thủ POSIX. Yêu cầu sự cho phép để cd vào thư mục của tập tin.

#!/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

Thông thường:

find `pwd` | grep <filename>

Ngoài ra, chỉ cho thư mục hiện tại:

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

hm tại sao lại ghét?
sjas

0

Tôi thích nhiều câu trả lời đã được đưa ra, nhưng tôi đã thấy điều này thực sự hữu ích, đặc biệt là trong một tập lệnh để có được đường dẫn đầy đủ của một tệp, bao gồm các liên kết sau và các tham chiếu tương đối như ...

dirname `readlink -e relative/path/to/file`

Mà sẽ trả về đường dẫn đầy đủ của fileđường dẫn gốc trở đi. Điều này có thể được sử dụng trong một tập lệnh để tập lệnh biết nó đang chạy từ đường nào, rất hữu ích trong một bản sao kho lưu trữ có thể được đặt ở bất cứ đâu trên máy.

basePath=`dirname \`readlink -e $0\``

Sau đó tôi có thể sử dụng ${basePath}biến trong các tập lệnh của mình để tham chiếu trực tiếp các tập lệnh khác.

Hi vọng điêu nay co ich,

Dave


0

Bạn có thể lưu cái này trong shell.rchoặc chỉ cần đặt trong bàn điều khiển

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

thí dụ:

ap somefile.txt

sẽ xuất

/home/user/somefile.txt

3
Nhưng sau đó ap ../foobar.txtsẽ cho /home/user/../foobar.txt, đó không phải là những gì bạn muốn.
bdesham

2
Cũng ap /tmp/foobar.txtsẽ cho /home/user//tmp/foobar.txt, đó là sai.
David đưa ra

-1
find / -samefile file.txt -print

Sẽ tìm thấy tất cả các liên kết đến tệp có cùng số inode như file.txt

thêm -xdevcờ sẽ tránh findvượt qua ranh giới thiết bị ("điểm gắn kết"). (Nhưng điều này có thể sẽ không tìm thấy gì nếu findkhông bắt đầu tại một thư mục trên cùng một thiết bị như file.txt)

Lưu ý rằng findcó thể báo cáo nhiều đường dẫn cho một đối tượng hệ thống tệp, bởi vì Inode có thể được liên kết bởi nhiều mục nhập thư mục, thậm chí có thể sử dụng các tên khác nhau. Ví dụ:

find /bin -samefile /bin/gunzip -ls

Sẽ xuất:

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

Điều này sẽ làm việc cho cả tập tin và thư mục:

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

-1

Điều này hoạt động với cả Linux và Mac OSX ..

 echo $(pwd)$/$(ls file.txt)

-1

Một tiện ích Linux khác, thực hiện công việc này:

fname <file>

-1

Đối với Mac OS, nếu bạn chỉ muốn nhận đường dẫn của tệp trong công cụ tìm, hãy kiểm soát nhấp vào tệp và cuộn xuống "Dịch vụ" ở phía dưới. Bạn có nhiều lựa chọn, bao gồm "sao chép đường dẫn" và "sao chép đường dẫn đầy đủ". Nhấp vào một trong những thứ này sẽ đặt đường dẫn vào bảng tạm.


-1

Trong mac đề cập dưới đây hoạt động dòng. Không cần thêm bất kỳ dòng ưa thích.

> pwd filename

6
Không, nó chỉ in thư mục làm việc (không có tên tệp) như tên của lệnh gợi ýprint working directory
anilbey

-2
fp () {
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$1
echo $RESULT | pbcopy
echo $RESULT
}

Sao chép văn bản vào clipboard của bạn và hiển thị văn bản trên cửa sổ terminal.

:)

(Tôi đã sao chép một số mã từ câu trả lời tràn ngăn xếp khác nhưng không thể tìm thấy câu trả lời đó nữa)


-2

cách dễ nhất tôi tìm thấy là

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

Nó hoạt động tốt cho tôi


-2

Trong Mac OSX, hãy thực hiện các bước sau:

  1. cd vào thư mục của tập tin đích.
  2. Nhập một trong hai lệnh đầu cuối sau.
Thiết bị đầu cuối
ls "`pwd`/file.txt"
echo $(pwd)/file.txt
  1. Thay thế file.txtbằng tên tập tin thực tế của bạn.
  2. nhấn Enter

-3

Bên cạnh "readlink -f", một lệnh thường được sử dụng khác:

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

Điều này cũng cung cấp đầy đủ đường dẫn và tên tệp tại bàn điều khiển

Off-topic: Phương pháp này chỉ cung cấp các liên kết tương đối , không tuyệt đối. Các readlink -flệnh là một trong những quyền.


-3

Tạo một hàm như bên dưới (lặp lại đường dẫn tuyệt đối của tệp với pwd và thêm tệp vào cuối đường dẫn:

abspath() { echo $(pwd "$1")/"$1"; }

Bây giờ bạn có thể tìm thấy bất kỳ đường dẫn tập tin:

abspath myfile.ext
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.