Câu trả lời:
Sử dụng readlink :
readlink -f file.txt
brew install coreutils
đó cài đặt homebrewgreadlink -f file.txt
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à realpath
trong 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, realpath
mộ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
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 readlink
gợi ý) vào tháng 3 năm 2011 :)
realpath -e
in lỗi nếu đối số không tồn tại.
Sau đây thường thực hiện các mẹo:
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
khô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.
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ó.
set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
### Kết quả: / home / ravi / ..
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
find $PWD -type f | grep "filename"
hoặc là
find $PWD -type f -name "*filename*"
find `pwd` -type file -name \*.dmp
Shift
và 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.realpath yourfile
để có được đường dẫn đầy đủ của tệp theo đề xuất của người khác.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 which
có 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/ .
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ự.
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
fpn
khô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 .
pwd
bả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.
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
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_dir
sẽ chứa/home/abc/sandbox/v1/../../test
./test.csh
bạn sẽ có một đường dẫn kết thúc bằng/test/.
Đố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 FILE
và grealpath 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 -f
và realpath
lệnh sẽ hoạt động tốt cho người dùng Unix không phải Mac.
brew install coreutils
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"
dirname "$1"
cd "$(dirname "$1")
vào dir tương đối này&& pwd -P
và có được đường dẫn tuyệt đối cho nó. -P
tùy chọn sẽ tránh tất cả các liên kết tượng trưng$(basename "$1")
echo
nóĐ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} \'
}
Đ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}
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ư .
và..
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
Bạn có thể lưu cái này trong shell.rc
hoặ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
ap ../foobar.txt
sẽ cho /home/user/../foobar.txt
, đó không phải là những gì bạn muốn.
ap /tmp/foobar.txt
sẽ cho /home/user//tmp/foobar.txt
, đó là sai.
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 -xdev
cờ sẽ tránh find
vượ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 find
khô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 find
có 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
Điều này hoạt động với cả Linux và Mac OSX ..
echo $(pwd)$/$(ls file.txt)
Đố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.
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
print working directory
Trong Mac OSX, hãy thực hiện các bước sau:
cd
vào thư mục của tập tin đích.ls "`pwd`/file.txt"
echo $(pwd)/file.txt
file.txt
bằng tên tập tin thực tế của bạn.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 -f
lệnh là một trong những quyền.
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