วิธีรับพา ธ แบบเต็มของไฟล์?


717

มีวิธีง่าย ๆ ที่ฉันสามารถพิมพ์เส้นทางแบบเต็มของ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

คำตอบ:


1188

ใช้readlink :

readlink -f file.txt

32
นั่นคือสิ่งที่ '-f' มีไว้สำหรับ
กำกับภาพยนตร์


5
เพิ่งทดสอบบน 10.9.2 ใช้งานได้ดี ที่ readlink / usr / local / opt / coreutils / libexec / gnubin / readlink readlink --version readlink (GNU coreutils) 8.22
J0hnG4lt

10
@ J0hnG4lt: นั่นเป็นเพราะคุณติดตั้ง coreutils ด้วย homebrew และเปลี่ยน PATH ให้ชี้ไปที่ไบนารีไบนารีที่ไม่ได้เตรียมการไว้ การติดตั้ง coreutils ออกจาก PATH เพียงอย่างเดียวและการใช้ "greadlink" ก็ใช้งานได้เช่นกัน
ทิมสมิ ธ

35
บน MAC: ติดตั้ง homebrew แล้วbrew install coreutilsจากนั้นgreadlink -f file.txt
ถึงกระ

217

ฉันคิดว่าคุณกำลังใช้ 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


ทำงานร่วมกับ cygwin (กับมินต์ 2.7.9)
Scrambo

1
realpathมุ่งมั่นที่จะ reput coreutils ของปี 2011 ปล่อย 8.15 เสร็จในเดือนมกราคม 2012 ฉันตอบคำถาม (พร้อมreadlinkข้อเสนอแนะ) ในเดือนมีนาคม 2011 :)
หนัง

2
realpath ไม่ได้ตรวจสอบการมีอยู่ของไฟล์มันแค่แก้ไขพา ธ การขอเส้นทางแบบเต็มของไฟล์ที่ไม่มีอยู่ควรส่งผลให้เกิดข้อผิดพลาด
โฟมบินได้

4
@styrofoamfly realpath -eพิมพ์ข้อผิดพลาดหากไม่มีอาร์กิวเมนต์
Arch Stanton

76

ต่อไปนี้มักจะหลอกลวง:

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

สวัสดี. ฉันพบคำตอบที่ดีที่สุดสำหรับความต้องการของฉัน คุณช่วยอธิบายได้ไหมว่าฉันจะใช้ตัวแปรโลคัลแทนพารามิเตอร์บรรทัดคำสั่ง (เช่น $ 1) ได้อย่างไร
deeJ

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

7
@SopalajodeArrierez เพราะreadlinkไม่สามารถใช้งานได้ถ้าไฟล์นั้นเป็น symlink มันจะแสดงเป้าหมายของ symlink ให้คุณแทน symlink นั้นเอง
qwertzguy

1
ฉันชอบสิ่งนี้เพราะreadlinkพาฉันกลับไปที่ dir พาเรนต์ที่ลิงก์สัญลักษณ์สร้างขึ้น แต่สิ่งนี้จะไม่สนใจ
Sukhi

set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") ### เอาต์พุต: / home / ravi / ..
Tom Hale

35

ฉันรู้ว่ามันมีวิธีที่ง่ายกว่านี้ แต่ถ้าฉันสามารถหามันพบได้ ...

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"

หรือ

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

1
สำหรับฉันแล้วสำหรับ mac สิ่งนี้ใช้ได้ผล - แทนที่จะเป็น $ pwd -find `pwd` -type file -name \*.dmp
mrwaim

14

หากคุณอยู่ในไดเรกทอรีเดียวกับไฟล์:

ls "`pwd`/file.txt"

แทนที่file.txtด้วยชื่อไฟล์เป้าหมายของคุณ


9
คุณสามารถทำได้echo $(pwd)/file.txt
อเล็กซ์

12

บน Windows:

  • โฮลดิ้งShiftและคลิกขวาที่แฟ้มใน Windows Explorer Copy as Pathจะช่วยให้คุณเลือกที่เรียกว่า นี่จะเป็นการคัดลอกพา ธ แบบเต็มของไฟล์ไปยังคลิปบอร์ด

บน Linux:

  • คุณสามารถใช้คำสั่งrealpath yourfileเพื่อรับเส้นทางแบบเต็มของไฟล์ตามที่ผู้อื่นแนะนำ

4

ฉันรู้ว่านี่เป็นคำถามเก่าตอนนี้ แต่เพียงเพิ่มข้อมูลที่นี่:

คำสั่ง Linux whichสามารถใช้ค้นหาไฟล์พา ธ ของไฟล์คำสั่งเช่น

$ which ls
/bin/ls

มีข้อแม้อยู่บ้าง โปรดดูhttps://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/


5
คำตอบนี้เฉพาะเจาะจงเกินไป OP ไม่เกี่ยวกับการค้นหาคำสั่ง
อัล

4

ใช้งานได้บน Mac, Linux, * ระวัง:

นี่จะให้ csv ที่ยกมาของไฟล์ทั้งหมดใน dir ปัจจุบัน:

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

ผลลัพธ์ของสิ่งนี้สามารถคัดลอกไปยังรายการหลามหรือโครงสร้างข้อมูลที่คล้ายกันได้อย่างง่ายดาย


พิมพ์เส้นทาง pwd ปัจจุบัน
Sand1512

ใช่เครื่องหมายจุลภาคคั่นพา ธ แบบเต็มสำหรับไฟล์ทั้งหมดใน pwd สำหรับไฟล์เพียงทำ ls 'ชื่อไฟล์' แทนที่จะเป็นเพียงแค่ 'ls'
Bhargav Srinivasan

3

คุณสามารถใช้สคริปต์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 เสรีและเปิดกว้างและคุณอาจจะตั้งขึ้นในนาทีที่


1
โดยทั่วไปแล้วpwdตัวเองควรจะทำงานได้ดีบน Linux และสภาพแวดล้อมระบบปฏิบัติการ Unix-like อื่น ๆ ส่วนใหญ่
karolus

3

คุณสามารถใช้ฟังก์ชั่นนี้ หากชื่อไฟล์ถูกกำหนดโดยไม่มีพา ธ สัมพัทธ์จะถือว่ามีชื่ออยู่ในไดเรกทอรีทำงานปัจจุบัน:

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

2

ในสถานการณ์ที่คล้ายกันฉันเปิดตัว cshell script จากที่อื่น สำหรับการตั้งค่าพา ธ สัมบูรณ์ที่ถูกต้องของสคริปต์เพื่อให้ทำงานในไดเรกทอรีที่กำหนดเท่านั้นฉันใช้รหัสต่อไปนี้:

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

$0 เก็บสตริงที่แน่นอนว่าสคริปต์ถูกดำเนินการอย่างไร

สำหรับเช่นถ้าสคริปต์เปิดตัวเช่นนี้$> ../../test/test.csh, $script_dirจะมี/home/abc/sandbox/v1/../../test


คะแนนสำหรับเรื่องนี้เนื่องจากเป็นวิธีที่ง่ายและเกี่ยวข้องมากที่สุด อย่างไรก็ตามถ้าคุณพิมพ์./test.cshคุณจะมีเส้นทางที่ลงท้ายด้วย/test/.
vinyll

2

สำหรับ Mac OS X ฉันได้แทนที่ยูทิลิตีที่มาพร้อมกับระบบปฏิบัติการและแทนที่ด้วย coreutils รุ่นใหม่กว่า สิ่งนี้ช่วยให้คุณเข้าถึงเครื่องมือเช่นreadlink -f(สำหรับพา ธ สัมบูรณ์ไปยังไฟล์) และrealpath(พา ธ สัมบูรณ์ไปยังไดเรกทอรี) บน Mac

รุ่น Homebrew ผนวก 'G' (สำหรับเครื่องมือ GNU) หน้าชื่อคำสั่ง - เพื่อให้เทียบเท่ากลายเป็นและgreadlink -f FILEgrealpath DIRECTORY

คำแนะนำสำหรับวิธีการติดตั้ง coreutils / GNU Tools บน Mac OS X ผ่าน Homebrew สามารถพบได้ในอาร์กติเคิล StackExchangeนี้

หมายเหตุ: คำสั่งreadlink -fและrealpathควรทำงานนอกกรอบสำหรับผู้ใช้ที่ไม่ใช่ Mac Unix


2
brew install coreutils
ถึงกระ

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

นี่คือคำอธิบายว่าเกิดอะไรขึ้นที่คำตอบของ @ ZeRemz :

  1. สคริปต์นี้รับเส้นทางสัมพัทธ์เป็นอาร์กิวเมนต์ "$1"
  2. จากนั้นเราจะได้รับส่วนdirnameของเส้นทางนั้น (คุณสามารถส่ง dir หรือไฟล์ไปที่สคริปต์นี้):dirname "$1"
  3. จากนั้นเราก็cd "$(dirname "$1")เข้าสู่ dir ญาติคนนี้
  4. && pwd -Pและรับเส้นทางที่แน่นอนสำหรับมัน -Pตัวเลือกจะหลีกเลี่ยงการเชื่อมโยงทั้งหมด
  5. หลังจากนั้นเราผนวกbasenameเส้นทางแน่นอน:$(basename "$1")
  6. ในฐานะที่เป็นขั้นตอนสุดท้ายเราechoมัน

1

มันใช้งานได้ดีสำหรับฉัน ไม่พึ่งพาระบบไฟล์ (โปร / คอนขึ้นอยู่กับความต้องการ) ดังนั้นมันจะเร็ว และควรพกพาไปที่ * 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} \'
}

1

นี่มันไร้เดียงสา แต่ฉันต้องทำให้มันเป็นไปตาม 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}

0

ปกติ:

find `pwd` | grep <filename>

อีกทางเลือกหนึ่งสำหรับโฟลเดอร์ปัจจุบัน:

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

หืมทำไมถึงเกลียด?
sjas

0

ฉันชอบคำตอบมากมายที่ได้ให้ไปแล้ว แต่ฉันพบว่ามันมีประโยชน์จริง ๆ โดยเฉพาะอย่างยิ่งในสคริปต์เพื่อให้ได้เส้นทางแบบเต็มของไฟล์รวมถึง symlink และการอ้างอิงที่เกี่ยวข้องเช่น.และ..

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

ซึ่งจะส่งคืนพา ธ แบบเต็มของfileจากรูทพา ธ เป็นต้นไป สิ่งนี้สามารถใช้ในสคริปต์เพื่อให้สคริปต์รู้ว่าพา ธ นั้นทำงานอยู่ไหนซึ่งมีประโยชน์ในที่เก็บโคลนซึ่งสามารถพบได้ทุกที่ในเครื่อง

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

ฉันสามารถใช้${basePath}ตัวแปรในสคริปต์ของฉันเพื่ออ้างอิงสคริปต์อื่นโดยตรง

หวังว่าจะช่วยได้

เดฟ


0

คุณสามารถบันทึกสิ่งนี้ไว้ในshell.rcหรือเพียงแค่ใส่ในคอนโซล

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

ตัวอย่าง:

ap somefile.txt

จะส่งออก

/home/user/somefile.txt

3
แต่ap ../foobar.txtจะให้/home/user/../foobar.txtซึ่งโดยทั่วไปแล้วไม่ใช่สิ่งที่คุณต้องการ
bdesham

2
นอกจากนี้ยังap /tmp/foobar.txtจะให้/home/user//tmp/foobar.txtซึ่งเป็นสิ่งที่ผิด
เดวิดให้

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

-1

สิ่งนี้จะใช้ได้ทั้งไฟล์และโฟลเดอร์:

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



-1

สำหรับ Mac OS หากคุณต้องการรับพา ธ ของไฟล์ในตัวค้นหาให้คลิกไฟล์แล้วเลื่อนลงไปที่ "Services" ที่ด้านล่าง คุณจะได้รับตัวเลือกมากมายรวมถึง "เส้นทางคัดลอก" และ "คัดลอกเส้นทางเต็ม" คลิกที่หนึ่งในนั้นทำให้เส้นทางบนคลิปบอร์ด


-1

ใน mac ที่กล่าวถึงงานด้านล่างบรรทัด ไม่จำเป็นต้องเพิ่มบรรทัดแฟนซีใด ๆ

> pwd filename

6
ไม่เพียงพิมพ์ไดเรกทอรีทำงาน (ไม่มีชื่อไฟล์) ตามชื่อของคำสั่งที่แนะนำprint working directory
anilbey

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

คัดลอกข้อความไปยังคลิปบอร์ดของคุณและแสดงข้อความในหน้าต่างเทอร์มินัล

:)

(ฉันคัดลอกโค้ดบางส่วนจากคำตอบล้นสแต็คอื่น แต่ไม่พบคำตอบนั้นอีกต่อไป)


-2

วิธีที่ง่ายที่สุดที่ฉันพบคือ

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

มันทำงานได้ดีสำหรับฉัน


-2

ใน Mac OSX ทำตามขั้นตอนต่อไปนี้:

  1. cd ลงในไดเรกทอรีของไฟล์เป้าหมาย
  2. พิมพ์คำสั่งเทอร์มินัลอย่างใดอย่างหนึ่งต่อไปนี้
สถานีปลายทาง
ls "`pwd`/file.txt"
echo $(pwd)/file.txt
  1. แทนที่file.txtด้วยชื่อไฟล์จริงของคุณ
  2. กด Enter

-3

ข้าง "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คำสั่งหนึ่งที่เหมาะสม


-3

สร้างฟังก์ชั่นเหมือนด้านล่าง (สะท้อนพา ธ สัมบูรณ์ของไฟล์ด้วย pwd และเพิ่มไฟล์ที่ส่วนท้ายของพา ธ :

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

ตอนนี้คุณสามารถค้นหาพา ธ ของไฟล์:

abspath myfile.ext
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.