คำสั่ง ls: ฉันจะได้รับรายชื่อเต็มเส้นทางแบบเรียกซ้ำหนึ่งบรรทัดต่อไฟล์ได้อย่างไร


493

ฉันจะรับ ls เพื่อแยกรายการแบบแบนของเส้นทางแบบหนึ่งต่อบรรทัดแบบเรียกซ้ำได้อย่างไร?

ตัวอย่างเช่นฉันเพียงต้องการรายชื่อไฟล์ที่มีเส้นทางเต็มของพวกเขา:

/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow
/home/dreftymac/stackoverflow/alpha.txt
/home/dreftymac/stackoverflow/bravo.txt
/home/dreftymac/stackoverflow/charlie.txt

ls -a1 เกือบจะเป็นสิ่งที่ฉันต้องการ แต่ฉันไม่ต้องการแฟรกเมนต์พา ธ ฉันต้องการพา ธ เต็ม


ดูเพิ่มเติมที่: tree
dreftymac

คำตอบ:


386

หากคุณต้องการใช้จริงๆให้จัดlsรูปแบบผลลัพธ์โดยใช้ awk:

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'

5
@dreftymac ซึ่งหมายความว่านี่คือการพูดอย่างเป็นกลางคำตอบที่ถูกต้องสำหรับคำถามที่คุณเขียนโดยเจตนาหรือไม่ ใช่อาจไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามที่คุณหวังว่าจะได้เขียน และในขณะที่ฉันเห็นด้วยกับจุดที่ใหญ่กว่าของคุณ: "เมื่อคนฉลาดชี้ไปที่ดวงจันทร์คนโง่มองที่นิ้ว" มันเป็นเรื่องยุติธรรมเท่านั้นที่เราจะลดผลกระทบของความรู้สึกส่วนตัวเพื่อประเมินความถูกต้องโดยเฉพาะเมื่อเกณฑ์ไม่มีความกำกวมใด ๆ
lurscher

1
@dreftymac ฉันยินดีที่จะเปลี่ยนการลงคะแนนของฉัน แต่ตอนนี้ถูกล็อคแล้วคุณต้องแก้ไขคำถามเพื่อให้ฉันสามารถอัปเดตการลงคะแนนได้
lurscher

7
ใครช่วยอธิบายคำอธิบายข้างต้นได้awkไหม
Mert Nuhoglu

2
การแก้ปัญหานี้ไม่ได้ละเว้นไดเรกทอรี (directory แต่ละคนได้รับสายของตัวเอง)
JayB

2
ขอบคุณ Btw น่าจะดีที่มีสิ่งนี้ใน 1 บรรทัดสำหรับการคัดลอกและวางอย่างรวดเร็ว
Leo Ufimtsev

567

ใช้ค้นหา:

find .
find /home/dreftymac

หากคุณต้องการไฟล์เท่านั้น (ละเว้นไดเรกทอรีอุปกรณ์ ฯลฯ ):

find . -type f
find /home/dreftymac -type f

2
สามารถlsพารามิเตอร์เช่น--sort=extension"แลก" โดยวิธีนี้?
n611x007

คุณยังสามารถใช้เอาต์พุต printf เพื่อแสดงข้อมูลบริบทที่จำเป็น (เช่นค้นหา -type f -printf '% p% u \ n')
xsubira

สามารถฟอร์แมตด้วย falg ได้หรือไม่ กล่าวคือ python pprint.pprint (ไฟล์)
นาธาน

72

ls -ld $(find .)

หากคุณต้องการเรียงลำดับผลลัพธ์ตามเวลาที่แก้ไข:

ls -ltd $(find .)


11
-bash: / bin / ls: รายการอาร์กิวเมนต์ยาวเกินไป
jperelli

1
+1 ทำงานให้ฉันด้วยไฟล์ 12106 ไฟล์และฉันสามารถใช้--sort=extensionพารามิเตอร์ของls
n611x007

3
ขอบคุณ ฉันจะไม่คิดด้วยตนเองของไวยากรณ์ (ดีและสั้น) - ฉันจะได้ใช้find . -name "*" -exec ls -ld '{}' \;(ที่ทำงานสิ่งที่จำนวนไฟล์) แต่คำสั่งของคุณสั้นเขียน;)
SRG

1
ls -ld $ (find.) จะแบ่งให้ฉันถ้าฉันแสดงรายการดิสก์ ntfs ที่ไฟล์มีช่องว่าง: ls: ไม่สามารถเข้าถึง / ระบบ: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว แต่ค้นหาด้วยเครื่องหมายคำพูดโดย @SRG ทำงาน
kuz8

ทางเลือกที่สั้นกว่า (ขึ้นอยู่กับความต้องการของคุณ) find . -lsคือ
IanS

59

ลองใช้วิธีที่ง่ายกว่านี้:

find "$PWD"

9
find "`pwd`"ถ้าเส้นทางมีช่องว่างหรืออักขระพิเศษอื่น ๆ
mustafa.0x

7
สิ่งนี้แตกต่างfind .อย่างไร? -.-
Salman von Abbas

7
@SalmanPK หากคุณให้หาพา ธ สัมบูรณ์ที่ต้องการpwdเริ่มต้นด้วยมันจะพิมพ์พา ธสัมบูรณ์ โดยวิธีการ "นี่เป็นวิธีที่แตกต่างจากfind" ;-)
yckart

44

คำสั่งที่ดีที่สุดคือ: tree -fi

ในการใช้ไฟล์ แต่ไม่ใช่ลิงค์คุณจะต้องลบไฟล์>ออก:

tree -fi |grep -v \>

หากคุณต้องการทราบลักษณะของแต่ละไฟล์ (เพื่ออ่านเฉพาะไฟล์ ASCII เท่านั้น) ด้วยสองwhiles:

tree -fi | \
grep -v \> | \
while read first ; do 
    file ${first}
done | \
while read second; do 
    echo ${second} | grep ASCII
done

ขอบคุณฉันไม่รู้เกี่ยวกับtree!
Dan Filimon

@Nakilon สิ่งที่ใกล้เคียงที่สุดคืออะไร? มันแสดงผลในทำนองเดียวกัน? คุณจะแสดงผลลัพธ์ที่คล้ายกันอย่างง่ายดายด้วยคำสั่งสั้น ๆ ได้อย่างไร
om01

6
@ om01: บน osx มันยากเพราะbrew install treeคุณใช้ homebrew
ccpizza

ฉันไม่สามารถแสดงรายการยกเว้นไฟล์ได้ มันมักจะแสดงรายการไดเรกทอรีด้วย ฉันจะทำอย่างไร
kommradHomer

ควรได้รับการจัดอันดับทางที่สูงกว่านี้!
der_grund

44

โอ้คำตอบยาว ๆ จริงๆ มันช่วยได้มากและในที่สุดฉันก็สร้างขึ้นมาเองซึ่งฉันกำลังมองหา:

ในการแสดงรายการไฟล์ทั้งหมดในไดเรกทอรีและไดเรกทอรีย่อย:

find "$PWD" -type f

ในการแสดงรายการไดเรกทอรีทั้งหมดในไดเรกทอรีและไดเรกทอรีย่อย:

find "$PWD" -type d

ในการแสดงรายการไดเรกทอรีและไฟล์ทั้งหมดในไดเรกทอรีและไดเรกทอรีย่อย:

find "$PWD"

2
และกรองตามนามสกุล:find "$PWD" -type f | grep '\.json$'
Killroy

2
ไม่ต้องการโพสต์การประมวลผลด้วย grep ใช้ -name ใน find like: find "$ PWD" -type f -name * .json และถ้าคุณต้องการลบไฟล์ที่แสดง: find "$ PWD" -type f -name * .json -exec rm {} \; ในทำนองเดียวกันหากคุณต้องการคัดลอกแล้วแทนที่ rm ด้วย cp และปลายทาง: -exec cp {} ปลายทาง
Godfather


16

การใช้คำสั่งภายนอกอื่นนอกเหนือจาก ls:

ls -R1 /path | 
  while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done


ตัวเลือกที่ไม่รู้จัก '-1' ยกเลิก
ilw

15
du -a

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


1
มีความคิดใดที่ฉันจะลบขนาดไฟล์ได้awkอย่างไร
Arnold Roa


10

อย่าทำให้มันซับซ้อน ฉันเพิ่งใช้มันและได้ผลลัพธ์ที่สวยงาม:

ls -lR /path/I/need

3
OP ต้องการเพียงแค่เส้นทางที่สมบูรณ์และไม่มีอะไรอื่น ls -lRจะไม่บรรลุเป้าหมายนั้น
codeforester

ขออภัยมันไม่ได้ทำ
Aryeh Beitz

9

วิธีที่ง่ายที่สุดสำหรับทุกคนในอนาคตของคุณคือ:

du

อย่างไรก็ตามสิ่งนี้ยังแสดงขนาดของสิ่งที่มีอยู่ในแต่ละโฟลเดอร์คุณสามารถใช้ awk เพื่อส่งออกเฉพาะชื่อโฟลเดอร์:

du | awk '{print $2}'

แก้ไข - ขออภัยฉันไม่ดี ฉันคิดว่ามันเป็นเพียงโฟลเดอร์ที่จำเป็น ฉันจะออกจากที่นี่ในกรณีที่ทุกคนในอนาคตต้องการมันต่อไป ...


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


9

ฉันคิดว่าสำหรับรายการแบนวิธีที่ดีที่สุดคือ:

find -D tree /fullpath/to-dir/ 

(หรือเพื่อบันทึกในไฟล์ txt)

find -D tree /fullpath/to-dir/ > file.txt

3
พยายามบน Mac OS 10.13.3 find: illegal option -- D
Jayant Bhawal


6

นี่คือคำตอบบางส่วนที่แสดงชื่อไดเรกทอรี

ls -mR * | sed -n 's/://p'

คำอธิบาย:

ls -mR * แสดงรายการชื่อไดเรกทอรีแบบเต็มที่ลงท้ายด้วย ':' จากนั้นแสดงรายการไฟล์ในไดเรกทอรีนั้นแยกต่างหาก

sed -n 's/://p' ค้นหาบรรทัดที่ลงท้ายด้วยโคลอนปิดโคลอนและพิมพ์บรรทัด

ด้วยการวนซ้ำในรายการไดเรกทอรีเราควรจะสามารถค้นหาไดเรกทอรีได้เช่นกัน ยังคงทำงานอยู่กับมัน มันเป็นความท้าทายที่จะใช้สัญลักษณ์แทนผ่าน xargs


คำตอบที่ดี .. สิ่งที่ฉันต้องการ!
Selvin

5

การเพิ่มไวด์การ์ดในตอนท้ายของไดเร็กทอรี ls บังคับให้พา ธ เต็ม ตอนนี้คุณมีสิ่งนี้:

$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt

คุณสามารถทำสิ่งนี้แทน:

$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt

น่าเสียดายที่นี่ไม่ได้พิมพ์เส้นทางแบบเต็มสำหรับไดเรกทอรีที่เรียกใช้ซ้ำดังนั้นมันอาจไม่ใช่โซลูชันแบบเต็มที่คุณต้องการ


นอกจากนี้น่าเสียดายที่คุณไม่สามารถ sudo ls ด้วยไวด์การ์ด (เนื่องจากไวด์การ์ดนั้นขยายเป็นผู้ใช้ปกติ)
andrew lorien

4

ฉันเห็นคำตอบมากมาย นี่เป็นของฉันและฉันคิดว่ามีประโยชน์มากถ้าคุณใช้ Mac

ฉันแน่ใจว่าคุณรู้ว่ามีไฟล์ "มัด" ( .app , .rtfd , .workflowและอื่น ๆ ) และเมื่อมองไปที่หน้าต่างของ Finder พวกเขาจะดูเหมือนไฟล์เดียว แต่พวกเขาไม่ และ$ lsหรือ$ findเห็นพวกเขาเป็นไดเรกทอรี ... ดังนั้นถ้าคุณไม่ต้องการรายชื่อเนื้อหาของพวกเขาเช่นกันสิ่งนี้ได้ผลสำหรับฉัน:

find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"

หลักสูตรนี้เหมาะสำหรับผู้ที่ใช้งานได้และคุณสามารถเพิ่มส่วนขยายของบันเดิลอื่น ๆ/ได้ หรือส่วนขยายอื่น ๆ /หากไม่ได้กำของโดยไม่ต้อง

ค่อนข้างน่าสนใจ " .lpdf/" (PDF หลายภาษา) มันมี.pdfนามสกุลปกติ " " (!!) หรือไม่มีใน Finder วิธีนี้คุณจะได้รับ (หรือนับเพียง 1 ไฟล์) สำหรับสิ่งนี้pdfและไม่ใช่สิ่งที่ ...


4

ls -lR คือสิ่งที่คุณกำลังมองหาหรืออย่างน้อยก็ฉัน ไชโย


OP ต้องการเพียงแค่เส้นทางที่สมบูรณ์และไม่มีอะไรอื่น ls -lRจะไม่บรรลุเป้าหมายนั้น
Hadrien TOMA

3

หากไดเร็กทอรีถูกส่งเป็นพา ธ แบบสัมพันธ์และคุณจะต้องแปลงเป็นพา ธ สัมบูรณ์ก่อนที่จะเรียกค้นหา ในตัวอย่างต่อไปนี้ไดเร็กทอรีถูกส่งเป็นพารามิเตอร์แรกไปยังสคริปต์:

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory

หากระบบของคุณมีreadlinkคุณสามารถทำได้directory=$(readlink -e $1)
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

True แต่การรวมกันของ cd / pwd จะใช้ได้กับทุกระบบ readlinkบน OS X 10.5.8 ไม่รองรับตัวเลือก -e
John Keyes

3
tar cf - $PWD|tar tvf -             

สิ่งนี้ช้า แต่ทำงานซ้ำและพิมพ์ทั้งไดเรกทอรีและไฟล์ คุณสามารถไพพ์ด้วย awk / grep หากคุณต้องการชื่อไฟล์โดยไม่มีข้อมูล / ไดเรกทอรีอื่น ๆ ทั้งหมด:

tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"          

2
คุณยังสามารถใช้งานได้อย่างง่ายดาย: tar cvf / dev / null $ PWD
RuleB

2

@ ghostdog74: ปรับแต่งเล็กน้อยด้วยวิธีแก้ปัญหาของคุณ
รหัสต่อไปนี้สามารถใช้ในการค้นหาไฟล์ที่มีเส้นทางที่สมบูรณ์ของมัน

sudo ls -R / | awk '<br/>
/:$/&&f{s=$0;f=0}<br/>
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}<br/>
NF&&f{ print s"/"$0 }' | grep [file_to_search]

1

ฉันรู้ชื่อไฟล์ แต่ต้องการไดเรกทอรีด้วย

ค้นหา $ PWD | ชื่อไฟล์ fgrep

ทำงานได้อย่างสมบูรณ์ใน Mac OS 10.12.1

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