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


22

ฉันต้องการวิธีง่ายๆในการรับพา ธ แบบเต็มไปยังไฟล์ ฉันพิมพ์สิ่งนี้:

echo `pwd`/file.ext

พยายามย่อให้สั้นลงฉันทำนามแฝงทุบตี:

alias fp='echo `pwd`/'

แต่ตอนนี้ถ้าผมพิมพ์fp file.extมีพื้นที่ที่ปรากฏระหว่างที่และ/file.ext

คำสั่งดังกล่าวมีอยู่แล้วและฉันหายไปหรือไม่ ถ้าไม่ฉันจะสร้างนามแฝงหรือฟังก์ชั่นดังกล่าวในทุบตีอย่างไร

คำตอบ:


30

บนระบบ Linux คุณควรreadlinkติดตั้งจากโครงการ GNU coreutils และสามารถทำได้:

readlink -f file.ext

ระบบ Debian / ubuntu อาจติดตั้งยูทิลิตี้realpathไว้ซึ่ง "ให้ฟังก์ชั่นส่วนใหญ่เหมือนกับ/bin/readlink -fในแพ็คเกจ coreutils"


readlink -f(หรือrealpathซึ่งเป็นยูทิลิตี้รุ่นเก่าที่เก็บไว้เพื่อความเข้ากันได้) จะขยายลิงก์สัญลักษณ์ทั้งหมดซึ่งไม่ต้องการ
Gilles 'หยุดชั่วร้าย'

8
fyi: ไม่ทำงานบน macosx
akira

บน mac ของฉันฉันได้ติดตั้ง coreutils โดยใช้homebrewและมันรวมrealpathอยู่ด้วย
Doug Harris

7

แทนที่จะใช้pwdคำสั่งให้ใช้PWDตัวแปร (ใน POSIX เช่นกัน):

fp () {
  case "$1" in
    /*) printf '%s\n' "$1";;
    *) printf '%s\n' "$PWD/$1";;
  esac
}

หากคุณต้องการสนับสนุน Windows การรับรู้พา ธ สัมบูรณ์จะซับซ้อนกว่าเนื่องจากแต่ละพอร์ตของเครื่องมือยูนิกซ์มีกฎของตนเองสำหรับการแปลพา ธ ไฟล์ ด้วย Cygwin ให้ใช้cygpathยูทิลิตีนี้


อาจเป็นทางเลือกของคุณ แต่ฟังก์ชั่นนี้จะไม่ส่งออกบรรทัดใหม่
cYrus

วิธีนี้มีข้อดีของการใช้ shell-builtins เท่านั้นซึ่งเร็วกว่าการโทรหาไบนารีภายนอก คุณควรทำให้ความจริงนี้ชัดเจนยิ่งขึ้น
akira

4

เพื่อตอบคำถามของคุณด้วยสิ่งที่คุณใช้ตอนนี้:

นามแฝงจะขยายที่ตำแหน่งที่คุณกำลังพิมพ์ในขณะนี้ คุณพิมพ์:

% fp<SPACE>file.ext

สิ่งนี้กลายเป็น

% echo `pwd`<SPACE>file.exe

คุณสามารถใช้ฟังก์ชันเพื่อหลีกเลี่ยงสิ่งนั้น:

function fp() {
    echo `pwd`/"$1"
}

คุณสามารถใช้มันได้ตามปกติ:

% fp file.ext

คุณต้องใส่เครื่องหมายอัญประกาศคู่ล้อมรอบการแทนที่คำสั่งและตัวแปร:echo "`pwd`/$1"
Gilles 'SO- หยุดความชั่วร้าย'

@Gilles: ภายใต้สถานการณ์อะไร
akira

2
@akira: ใช้เครื่องหมายอัญประกาศคู่เสมอยกเว้นว่าคุณต้องการให้ผลลัพธ์ของการขยายเป็นเสมือนรูปแบบการวนรอบและผลลัพธ์ของการกระจายแบบแยกส่วนจะเป็นคำ ที่นี่คุณกำลังสร้างชื่อไฟล์เดียวดังนั้นจำเป็นต้องใช้เครื่องหมายคำพูดคู่ (ลองใช้ฟังก์ชันของคุณกับไฟล์ที่เรียกว่า*ในไดเรกทอรีที่มีไฟล์อื่น ๆ )
Gilles 'หยุดความชั่วร้าย'

' ' ถูกล้อมรอบด้วยเปลือก (zsh ในกรณีของฉัน) และขยายก่อนที่จะถึงฟังก์ชั่น fp *อัตราผลตอบแทน/tmp/4cc3ea0c1b34bตั้งแต่ thats paramete แรกสำหรับฟังก์ชั่น พารามิเตอร์อื่น ๆ จะเป็นไฟล์อื่น ๆ ในไดเรกทอรี ทันทีที่ฉันมีไฟล์ชื่อ ' ' ฟังก์ชั่นยังคงทำงานตามที่คาดไว้เรียกมันด้วย "*" หรือ * หรือ *
akira

ทุบตีเป็นหนึ่งใน "ไม่ดี" ที่นี่ตามที่ดูเหมือนทุบตีผลผลิตสิ่งที่คุณกำลังอ้างถึง
akira

3

คุณสามารถใช้ได้:

realpath file.ext

ฉันไม่มีอันนั้น สิ่งนั้นมาจากไหน
frabjous

@frabjous: เฉพาะกับเดเบียนและตราสารอนุพันธ์เท่านั้นและจะติดตั้งเฉพาะเมื่อคุณร้องขอหรือแพ็คเกจที่ขึ้นอยู่กับมัน
Gilles 'หยุดชั่วร้าย'

ฉันกำลังใช้ Arch ไม่ใช่เดเบียน แต่มีแพ็คเกจสำหรับ AUR อยู่ดี ไม่แน่ใจว่ามันคุ้มค่าติดตั้งถ้าฉันมี readlink แล้ว
frabjous

นั่นคือตัวเลือก; หรือคุณอาจพิจารณาฟังก์ชั่นดูคำตอบของGilles อย่างไรก็ตามขึ้นอยู่กับการใช้งานจริงที่คุณต้องการทำ (ฉันอยากรู้)
cYrus

@frabjous: คุณไม่ได้ระบุระบบที่คุณใช้ แต่ถ้าใช้ตัวจัดการแพคเกจที่ใช้ความถนัด (Debian, Ubuntu, Mint, ฯลฯ ) คุณสามารถพิมพ์apt-cache search realpathเพื่อแสดงให้เห็นว่าcoreutilsและแพ็คเกจol ' realpathทั้งสองมีมัน จากนั้นคุณสามารถพิมพ์sudo apt-get install realpath(หรือcoreutils) เพื่อติดตั้ง
Michael Scheper

1

จาก/programming//a/3915420/5795941

นี่เป็นวิธีเดียวที่เป็นที่ยอมรับสำหรับฉัน ไม่ขยายลิงก์เช่น realpath และ readlink และเป็นวิธีการทำแบบดั้งเดิมที่ฉันเคยเห็นมาแล้ว

#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.