แสดงรายการไฟล์ซ้ำใน Linux CLI พร้อมพา ธ ที่สัมพันธ์กับไดเรกทอรีปัจจุบัน


224

นี่คล้ายกับคำถามนี้แต่ฉันต้องการรวมเส้นทางที่เกี่ยวข้องกับไดเรกทอรีปัจจุบันในยูนิกซ์ ถ้าฉันทำต่อไปนี้:

ls -LR | grep .txt

ไม่รวมเส้นทางแบบเต็ม ตัวอย่างเช่นฉันมีโครงสร้างไดเรกทอรีต่อไปนี้:

test1/file.txt
test2/file1.txt
test2/file2.txt

รหัสข้างต้นจะกลับมา:

file.txt
file1.txt
file2.txt

ฉันจะให้มันรวมเส้นทางที่สัมพันธ์กับไดเรกทอรีปัจจุบันโดยใช้คำสั่ง Unix มาตรฐานได้อย่างไร


4
นี่เพิ่งแสดงให้เห็นว่า ls ขาดคุณสมบัตินี้ไป
Arjun Singri

1
มันเป็นความอัปยศทั้งหมดของการแก้ปัญหาเหล่านี้ต้องหรือfind treeฉันกำลังเข้าสู่อุปกรณ์ Android ที่ฉันมีlsและไม่มีเครื่องมืออื่น ๆ เหล่านี้: /
Ponkadoodle

คำตอบ:


304

ใช้ค้นหา:

find . -name \*.txt -print

บนระบบที่ใช้ GNU ค้นหาเช่นการกระจาย GNU / Linux ส่วนใหญ่คุณสามารถปล่อย -print


11
... และสำหรับเรื่องนั้นคุณสามารถละทิ้ง '.'
Adam Mitz

7
สำหรับเส้นทางที่แน่นอนให้ใช้find $(pwd) -name \*.txt
Zags

2
หากรูปแบบการมีส่วนหนึ่งของชื่อไดเรกทอรีควรใช้แทน-path "*docs/*.txt" เหมือนกับ-name-wholename-path
dashesy

9
ใช้-type fเพื่อส่งคืนไฟล์เท่านั้นไม่ใช่ไดเรกทอรีลิงก์สัญลักษณ์ ฯลฯ
ผู้ใช้

2
-name "*.txt"จะไม่ตรงกันfile.TXT- ให้ใช้-iname "*.txt"แทนตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เสมอ
ccpizza

73

ใช้treeกับ-f(พา ธ แบบเต็ม) และ-i(ไม่มีบรรทัดการเยื้อง):

tree -if --noreport .
tree -if --noreport directory/

จากนั้นคุณสามารถใช้ grepเพื่อกรองสิ่งที่คุณต้องการ


หากไม่พบคำสั่งคุณสามารถติดตั้งได้:

พิมพ์คำสั่งต่อไปนี้เพื่อติดตั้งคำสั่ง tree บน RHEL / CentOS และ Fedora linux:

# yum install tree -y

หากคุณใช้ Debian / Ubuntu, Mint Linux ให้พิมพ์คำสั่งต่อไปนี้ในเทอร์มินัลของคุณ:

$ sudo apt-get install tree -y

2
การตั้งค่าใด ๆ ที่จะแสดงรายการเฉพาะไฟล์และไม่รวมโฟลเดอร์
thebugfinder

25

ลองfindดู คุณสามารถค้นหามันได้อย่างแม่นยำในหน้า man แต่มันก็เป็นอย่างนี้:

find [start directory] -name [what to find]

ดังนั้นสำหรับตัวอย่างของคุณ

find . -name "*.txt"

ควรให้สิ่งที่คุณต้องการ



5

ที่หลอกลวง:

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

แต่มันก็ทำเช่นนั้นโดย "ทำบาป" ด้วยการแยกวิเคราะห์lsซึ่งถือว่าเป็นรูปแบบที่ไม่ดีจากชุมชน GNU และ Ghostscript


2
@CAFEBABE: ถือว่าเป็นข้อห้ามในการแยกวิเคราะห์ผลลัพธ์lsเพราะโดยทั่วไปจะนำไปสู่ข้อบกพร่อง ประโยคที่เป็นปัญหาพยายามเรียกมันออกมา นอกจากนี้ยังมีเรื่องตลกที่ฉันลบออกไป
Adam Katz

4
DIR=your_path
find $DIR | sed 's:""$DIR""::'

'sed' จะลบ 'your_path' จากผลลัพธ์ 'ค้นหา' ทั้งหมด และคุณจะได้รับความสัมพันธ์กับเส้นทาง 'DIR'


ตรงนี้เป็นสิ่งที่ฉันต้องการ แต่ก็ยังคายเส้นทางเต็มสำหรับฉัน
v3nt

1
อย่าใช้เครื่องหมายอะโพสโทรฟี - find / tmp | sed s: "/ tmp" :: | เพิ่มเติม
Kieren Dixon

4

ในการรับชื่อไฟล์พา ธ เต็มจริงของไฟล์ที่ต้องการโดยใช้คำสั่ง find ให้ใช้กับคำสั่ง pwd:

find $(pwd) -name \*.txt -print

1

นี่คือสคริปต์ Perl:

sub format_lines($)
{
    my $refonlines = shift;
    my @lines = @{$refonlines};
    my $tmppath = "-";

    foreach (@lines)
    {
        next if ($_ =~ /^\s+/);
        if ($_ =~ /(^\w+(\/\w*)*):/)
        {
            $tmppath = $1 if defined $1;    
            next;
        }
        print "$tmppath/$_";
    }
}

sub main()
{
        my @lines = ();

    while (<>) 
    {
        push (@lines, $_);
    }
    format_lines(\@lines);
}

main();

การใช้งาน:

ls -LR | perl format_ls-LR.pl

นี่เป็นโปรแกรม Perl ที่แย่มาก อาจนานกว่านี้ 2-3 เท่าและซับซ้อนกว่าที่ควรจะเป็น
Brad Gilbert

1

คุณสามารถสร้างฟังก์ชั่นเชลล์เช่นใน.zshrcหรือ.bashrc:

filepath() {
    echo $PWD/$1
}

filepath2() {
    for i in $@; do
        echo $PWD/$i
    done
}

คนแรกจะทำงานกับไฟล์เดียวเท่านั้นอย่างเห็นได้ชัด


1

ค้นหาไฟล์ชื่อ "filename" บนระบบไฟล์ของคุณเริ่มการค้นหาจากไดเรกทอรีราก "/" "ชื่อไฟล์"

find / -name "filename" 

1

หากคุณต้องการเก็บรายละเอียดมาพร้อมกับ ls เช่นขนาดไฟล์และอื่น ๆ ในผลลัพธ์ของคุณสิ่งนี้น่าจะใช้ได้

sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file

1

ในเปลือกปลาคุณสามารถทำสิ่งนี้เพื่อแสดงรายการไฟล์ PDF ทั้งหมดแบบเรียกซ้ำรวมถึงไฟล์ในไดเรกทอรีปัจจุบัน:

$ ls **pdf

เพียงลบ 'pdf' หากคุณต้องการไฟล์ประเภทใดก็ได้


0

คุณสามารถใช้ฟังก์ชันนี้ได้เช่นนี้
ประการแรกใช้คำสั่ง ls ที่ชี้ไปยังไดเรกทอรีเป้าหมาย ภายหลังใช้คำสั่ง find กรองผลลัพธ์จากมัน จากกรณีของคุณดูเหมือนว่า - ชื่อไฟล์จะเริ่มต้นด้วยคำเสมอ file***.txt

ls /some/path/here | find . -name 'file*.txt'   (* represents some wild card search)

0

ใน mycase พร้อมคำสั่ง tree

เส้นทางสัมพัทธ์

tree -ifF ./dir | grep -v '^./dir$' | grep -v '.*/$' | grep '\./.*' | while read file; do
  echo $file
done

เส้นทางที่แน่นอน

tree -ifF ./dir | grep -v '^./dir$' | grep -v '.*/$' | grep '\./.*' | while read file; do
  echo $file | sed -e "s|^.|$PWD|g"
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.