มีวิธีง่าย ๆ ที่ฉันสามารถพิมพ์เส้นทางแบบเต็มของfile.txt
?
file.txt = /nfs/an/disks/jj/home/dir/file.txt
<command>
dir> <command> file.txt
ควรพิมพ์
/nfs/an/disks/jj/home/dir/file.txt
มีวิธีง่าย ๆ ที่ฉันสามารถพิมพ์เส้นทางแบบเต็มของfile.txt
?
file.txt = /nfs/an/disks/jj/home/dir/file.txt
<command>
dir> <command> file.txt
ควรพิมพ์
/nfs/an/disks/jj/home/dir/file.txt
คำตอบ:
ใช้readlink :
readlink -f file.txt
brew install coreutils
จากนั้นgreadlink -f file.txt
ฉันคิดว่าคุณกำลังใช้ Linux
ฉันพบโปรแกรมอรรถประโยชน์ที่เรียกว่าrealpath
ใน coreutils 8.15
realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt
ตามความคิดเห็น @ styrofoam-fly และ @ arch-standton realpath
เพียงอย่างเดียวไม่ได้ตรวจสอบการมีอยู่ของไฟล์เพื่อแก้ปัญหานี้เพิ่มe
อาร์กิวเมนต์:realpath -e file
realpath
มุ่งมั่นที่จะ reput coreutils ของปี 2011 ปล่อย 8.15 เสร็จในเดือนมกราคม 2012 ฉันตอบคำถาม (พร้อมreadlink
ข้อเสนอแนะ) ในเดือนมีนาคม 2011 :)
realpath -e
พิมพ์ข้อผิดพลาดหากไม่มีอาร์กิวเมนต์
ต่อไปนี้มักจะหลอกลวง:
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
ไม่สามารถใช้งานได้ถ้าไฟล์นั้นเป็น symlink มันจะแสดงเป้าหมายของ symlink ให้คุณแทน symlink นั้นเอง
readlink
พาฉันกลับไปที่ dir พาเรนต์ที่ลิงก์สัญลักษณ์สร้างขึ้น แต่สิ่งนี้จะไม่สนใจ
set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
### เอาต์พุต: / home / ravi / ..
ฉันรู้ว่ามันมีวิธีที่ง่ายกว่านี้ แต่ถ้าฉันสามารถหามันพบได้ ...
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"
หรือ
find $PWD -type f -name "*filename*"
find `pwd` -type file -name \*.dmp
หากคุณอยู่ในไดเรกทอรีเดียวกับไฟล์:
ls "`pwd`/file.txt"
แทนที่file.txt
ด้วยชื่อไฟล์เป้าหมายของคุณ
echo $(pwd)/file.txt
Shift
และคลิกขวาที่แฟ้มใน Windows Explorer Copy as Path
จะช่วยให้คุณเลือกที่เรียกว่า นี่จะเป็นการคัดลอกพา ธ แบบเต็มของไฟล์ไปยังคลิปบอร์ดrealpath yourfile
เพื่อรับเส้นทางแบบเต็มของไฟล์ตามที่ผู้อื่นแนะนำฉันรู้ว่านี่เป็นคำถามเก่าตอนนี้ แต่เพียงเพิ่มข้อมูลที่นี่:
คำสั่ง Linux which
สามารถใช้ค้นหาไฟล์พา ธ ของไฟล์คำสั่งเช่น
$ which ls
/bin/ls
มีข้อแม้อยู่บ้าง โปรดดูhttps://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/
ใช้งานได้บน Mac, Linux, * ระวัง:
นี่จะให้ csv ที่ยกมาของไฟล์ทั้งหมดใน dir ปัจจุบัน:
ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'
ผลลัพธ์ของสิ่งนี้สามารถคัดลอกไปยังรายการหลามหรือโครงสร้างข้อมูลที่คล้ายกันได้อย่างง่ายดาย
คุณสามารถใช้สคริปต์fpn (ชื่อพา ธ เต็ม) :
% 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
ไม่ได้เป็นแพคเกจลินุกซ์มาตรฐาน แต่มันเป็นโครงการ GitHub เสรีและเปิดกว้างและคุณอาจจะตั้งขึ้นในนาทีที่
pwd
ตัวเองควรจะทำงานได้ดีบน Linux และสภาพแวดล้อมระบบปฏิบัติการ Unix-like อื่น ๆ ส่วนใหญ่
คุณสามารถใช้ฟังก์ชั่นนี้ หากชื่อไฟล์ถูกกำหนดโดยไม่มีพา ธ สัมพัทธ์จะถือว่ามีชื่ออยู่ในไดเรกทอรีทำงานปัจจุบัน:
abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }
การใช้งาน:
$ abspath file.txt
/I/am/in/present/dir/file.txt
การใช้งานกับเส้นทางญาติ:
$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt
ด้วยช่องว่างในชื่อไฟล์:
$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt
ในสถานการณ์ที่คล้ายกันฉันเปิดตัว cshell script จากที่อื่น สำหรับการตั้งค่าพา ธ สัมบูรณ์ที่ถูกต้องของสคริปต์เพื่อให้ทำงานในไดเรกทอรีที่กำหนดเท่านั้นฉันใช้รหัสต่อไปนี้:
set script_dir = `pwd`/`dirname $0`
$0
เก็บสตริงที่แน่นอนว่าสคริปต์ถูกดำเนินการอย่างไร
สำหรับเช่นถ้าสคริปต์เปิดตัวเช่นนี้$> ../../test/test.csh
,
$script_dir
จะมี/home/abc/sandbox/v1/../../test
./test.csh
คุณจะมีเส้นทางที่ลงท้ายด้วย/test/.
สำหรับ Mac OS X ฉันได้แทนที่ยูทิลิตีที่มาพร้อมกับระบบปฏิบัติการและแทนที่ด้วย coreutils รุ่นใหม่กว่า สิ่งนี้ช่วยให้คุณเข้าถึงเครื่องมือเช่นreadlink -f
(สำหรับพา ธ สัมบูรณ์ไปยังไฟล์) และrealpath
(พา ธ สัมบูรณ์ไปยังไดเรกทอรี) บน Mac
รุ่น Homebrew ผนวก 'G' (สำหรับเครื่องมือ GNU) หน้าชื่อคำสั่ง - เพื่อให้เทียบเท่ากลายเป็นและgreadlink -f FILE
grealpath DIRECTORY
คำแนะนำสำหรับวิธีการติดตั้ง coreutils / GNU Tools บน Mac OS X ผ่าน Homebrew สามารถพบได้ในอาร์กติเคิล StackExchangeนี้
หมายเหตุ: คำสั่งreadlink -f
และrealpath
ควรทำงานนอกกรอบสำหรับผู้ใช้ที่ไม่ใช่ Mac Unix
brew install coreutils
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
นี่คือคำอธิบายว่าเกิดอะไรขึ้นที่คำตอบของ @ ZeRemz :
"$1"
dirname "$1"
cd "$(dirname "$1")
เข้าสู่ dir ญาติคนนี้&& pwd -P
และรับเส้นทางที่แน่นอนสำหรับมัน -P
ตัวเลือกจะหลีกเลี่ยงการเชื่อมโยงทั้งหมด$(basename "$1")
echo
มันมันใช้งานได้ดีสำหรับฉัน ไม่พึ่งพาระบบไฟล์ (โปร / คอนขึ้นอยู่กับความต้องการ) ดังนั้นมันจะเร็ว และควรพกพาไปที่ * NIX ส่วนใหญ่ มันจะถือว่าสตริงที่ส่งผ่านนั้นสัมพันธ์กับ PWD และไม่ใช่ไดเรกทอรีอื่น
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} \'
}
นี่มันไร้เดียงสา แต่ฉันต้องทำให้มันเป็นไปตาม POSIX ต้องการสิทธิ์ในการ cd ลงในไดเรกทอรีของไฟล์
#!/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}
ปกติ:
find `pwd` | grep <filename>
อีกทางเลือกหนึ่งสำหรับโฟลเดอร์ปัจจุบัน:
find `pwd` -maxdepth 1 | grep <filename>
ฉันชอบคำตอบมากมายที่ได้ให้ไปแล้ว แต่ฉันพบว่ามันมีประโยชน์จริง ๆ โดยเฉพาะอย่างยิ่งในสคริปต์เพื่อให้ได้เส้นทางแบบเต็มของไฟล์รวมถึง symlink และการอ้างอิงที่เกี่ยวข้องเช่น.
และ..
dirname `readlink -e relative/path/to/file`
ซึ่งจะส่งคืนพา ธ แบบเต็มของfile
จากรูทพา ธ เป็นต้นไป สิ่งนี้สามารถใช้ในสคริปต์เพื่อให้สคริปต์รู้ว่าพา ธ นั้นทำงานอยู่ไหนซึ่งมีประโยชน์ในที่เก็บโคลนซึ่งสามารถพบได้ทุกที่ในเครื่อง
basePath=`dirname \`readlink -e $0\``
ฉันสามารถใช้${basePath}
ตัวแปรในสคริปต์ของฉันเพื่ออ้างอิงสคริปต์อื่นโดยตรง
หวังว่าจะช่วยได้
เดฟ
คุณสามารถบันทึกสิ่งนี้ไว้ในshell.rc
หรือเพียงแค่ใส่ในคอนโซล
function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"
ตัวอย่าง:
ap somefile.txt
จะส่งออก
/home/user/somefile.txt
ap ../foobar.txt
จะให้/home/user/../foobar.txt
ซึ่งโดยทั่วไปแล้วไม่ใช่สิ่งที่คุณต้องการ
ap /tmp/foobar.txt
จะให้/home/user//tmp/foobar.txt
ซึ่งเป็นสิ่งที่ผิด
find / -samefile file.txt -print
จะค้นหาลิงก์ทั้งหมดไปยังไฟล์ที่มีหมายเลขไอโหนดเดียวกันกับ file.txt
การเพิ่มการ-xdev
ตั้งค่าสถานะจะหลีกเลี่ยงfind
การข้ามขอบเขตอุปกรณ์ ("จุดเชื่อมต่อ") (แต่สิ่งนี้อาจจะไม่พบสิ่งใดหากfind
ไม่เริ่มต้นที่ไดเรกทอรีในอุปกรณ์เดียวกันfile.txt
)
โปรดทราบว่าfind
สามารถรายงานหลายเส้นทางสำหรับวัตถุระบบไฟล์เดียวเนื่องจาก Inode สามารถเชื่อมโยงได้มากกว่าหนึ่งรายการไดเรกทอรีอาจเป็นไปได้ว่าใช้ชื่ออื่น ตัวอย่างเช่น
find /bin -samefile /bin/gunzip -ls
จะส่งออก:
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
สิ่งนี้จะใช้ได้ทั้งไฟล์และโฟลเดอร์:
getAbsolutePath(){
[[ -d $1 ]] && { cd "$1"; echo "$(pwd -P)"; } ||
{ cd "$(dirname "$1")" || exit 1; echo "$(pwd -P)/$(basename "$1")"; }
}
ใช้ได้กับทั้ง Linux และ Mac OSX
echo $(pwd)$/$(ls file.txt)
ยูทิลิตี้ Linux อื่นที่ทำงานนี้:
fname <file>
สำหรับ Mac OS หากคุณต้องการรับพา ธ ของไฟล์ในตัวค้นหาให้คลิกไฟล์แล้วเลื่อนลงไปที่ "Services" ที่ด้านล่าง คุณจะได้รับตัวเลือกมากมายรวมถึง "เส้นทางคัดลอก" และ "คัดลอกเส้นทางเต็ม" คลิกที่หนึ่งในนั้นทำให้เส้นทางบนคลิปบอร์ด
ใน mac ที่กล่าวถึงงานด้านล่างบรรทัด ไม่จำเป็นต้องเพิ่มบรรทัดแฟนซีใด ๆ
> pwd filename
print working directory
fp () {
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$1
echo $RESULT | pbcopy
echo $RESULT
}
คัดลอกข้อความไปยังคลิปบอร์ดของคุณและแสดงข้อความในหน้าต่างเทอร์มินัล
:)
(ฉันคัดลอกโค้ดบางส่วนจากคำตอบล้นสแต็คอื่น แต่ไม่พบคำตอบนั้นอีกต่อไป)
วิธีที่ง่ายที่สุดที่ฉันพบคือ
for i in `ls`; do echo "`pwd`/$i"; done
มันทำงานได้ดีสำหรับฉัน
ใน Mac OSX ทำตามขั้นตอนต่อไปนี้:
cd
ลงในไดเรกทอรีของไฟล์เป้าหมายls "`pwd`/file.txt"
echo $(pwd)/file.txt
file.txt
ด้วยชื่อไฟล์จริงของคุณข้าง "readlink -f" คำสั่งอื่นที่ใช้กันโดยทั่วไป:
$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 $
สิ่งนี้ยังให้เส้นทางแบบเต็มและชื่อไฟล์ที่คอนโซล
Off-topic: วิธีนี้จะให้การเชื่อมโยงที่เกี่ยวข้องไม่ใช่แบบสัมบูรณ์ readlink -f
คำสั่งหนึ่งที่เหมาะสม
สร้างฟังก์ชั่นเหมือนด้านล่าง (สะท้อนพา ธ สัมบูรณ์ของไฟล์ด้วย pwd และเพิ่มไฟล์ที่ส่วนท้ายของพา ธ :
abspath() { echo $(pwd "$1")/"$1"; }
ตอนนี้คุณสามารถค้นหาพา ธ ของไฟล์:
abspath myfile.ext