รับเส้นทางที่แน่นอนของไฟล์โดยใช้คำสั่ง 'find'


26

มีวิธีรับพา ธ สัมบูรณ์ของไฟล์ที่กำลังค้นหาอยู่หรือไม่?

ตัวอย่างเช่น:

find .. -name "filename"

มันให้ผลลัพธ์เช่น../filenameฉัน แต่ฉันต้องการเส้นทางเต็ม

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

ขอบคุณ


1
คำถามที่คล้ายกันในดังนั้น
Glutanimate

คำตอบ:


15

ลองสิ่งที่ชอบ:

find "$(cd ..; pwd)" -name "filename"

$(cd ..; pwd)ขอบคุณฉันเป็นเพียงการทดสอบ ที่นี่ใช้งานได้ แต่ถ้าฉันทำคนเดียวใน Terminal ฉันไม่สามารถรับ dir หลัก ... ฉันได้รับ "Bash: <dir>: เป็นไดเรกทอรีและถ้า$(cd ..; echo "something")ฉันได้รับ" บางสิ่ง: ไม่ใช่ คำสั่ง "
JorgeeFG

คุณหมายถึงคำสั่งแยกต่างหากหรือไม่? จากนั้นคุณจะต้องทิ้งเครื่องหมายดอลลาร์:(cd ..; pwd)
Scrutinizer

ขอบคุณนั่นมัน การอ้างอิงใด ๆ ของสาเหตุที่ฉันควรลบ $, มันมีผลต่อ subshell อย่างไร?
JorgeeFG

1
ใช่( ... )หมายถึงดำเนินการใน subshell ผลลัพธ์ที่ได้รับการเขียนไปยัง stdout $( ... )ย่อมาจาก "การทดแทนคำสั่ง" หลังสามารถใช้ราวกับว่ามันเป็นการขยายตัวแปร
Scrutinizer

find / -name "filename"
Panther

12

ลองใช้-execตัวเลือกของfind:

find .. -name "filename" -exec readlink -f {} \;

หมายเหตุ: readlinkพิมพ์ค่าของลิงก์สัญลักษณ์หรือชื่อไฟล์แบบบัญญัติ


สิ่งนี้จะเรียก readlink ในทุก ๆ ไฟล์ดังนั้นมันจะไม่มีประสิทธิภาพมาก
bac0n

9

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

find ~+ -type f -name "filename"

หากดำเนินการใน~/Desktopสิ่งนี้จะถูกขยายเป็น

find /home/yourusername/Desktop -type f -name "filename"

และพิมพ์ผลลัพธ์เช่น:

/home/yourusername/Desktop/filename

หากคุณต้องการใช้วิธีการนี้กับไดเรกทอรีหลักของไดเรกทอรีการทำงานปัจจุบันคุณต้องcdก่อนfind:

cd .. && find ~+ -type f -name "filename"


1

นอกจากนี้การใช้ PWD สามารถแสดงไดเรกทอรีทั้งหมด Pwd จะแสดงไดเรกทอรีทั้งหมดของคุณเช่นเดียวกับการขยายชื่อไฟล์ หวังว่านี่จะช่วยได้


1

สิ่งนี้ใช้งานได้สำหรับฉัน แต่จะคืนสิ่งที่เกิดขึ้นครั้งแรกเท่านั้น

realpath $(find . -type f -name filename -print -quit)

เพื่อรับเส้นทางแบบเต็มสำหรับทุกเหตุการณ์ (ตามที่แนะนำโดย Sergiy Kolodyazhnyy)

find . -type f -name filename | xargs realpath

ลบความคิดเห็นก่อนหน้า, +1, good job @Wyrmwood
Sergiy Kolodyazhnyy

1

การถอดส่วนประกอบไดเรกทอรีที่ผ่านมากับการขยายตัวพารามิเตอร์

find "${PWD%/*}" -name 'filename'

ตัวอย่างของวิธีที่คุณสามารถใช้mapfileเพื่อบันทึกผลลัพธ์จากการค้นหาไปยังอาร์เรย์ที่จัดทำดัชนีเพื่อใช้ในภายหลัง

mapfile -t -d '' < <(find ${PWD%/*} -name 'filename' -print0)

(หากไม่ได้ระบุชื่ออาเรย์ MAPFILE จะเป็นชื่ออาเรย์เริ่มต้น)

for i in "${MAPFILE[@]}"; do
    echo "$((n++)) $i"
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.