Daftar file secara rekursif di Linux CLI dengan path relatif ke direktori saat ini

224

Ini mirip dengan pertanyaan ini , tetapi saya ingin memasukkan path relatif ke direktori saat ini di unix. Jika saya melakukan hal berikut:

ls -LR | grep .txt

Itu tidak termasuk path lengkap. Sebagai contoh, saya memiliki struktur direktori berikut:

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

Kode di atas akan kembali:

file.txt
file1.txt
file2.txt

Bagaimana saya bisa memasukkan path relatif ke direktori saat ini menggunakan perintah Unix standar?

Darryl Hein
sumber
4
Ini hanya menunjukkan bahwa ls kehilangan fitur ini.
Arjun Singri
1
Sayang sekali semua solusi ini memerlukan findatau tree. Saya ssh'ing ke perangkat android di mana saya tampaknya hanya punya ls, dan tidak ada alat-alat lain ini: /
Ponkadoodle

Jawaban:

304

Gunakan temukan:

find . -name \*.txt -print

Pada sistem yang menggunakan GNU find, seperti kebanyakan distribusi GNU / Linux, Anda dapat meninggalkan -print.

Andru Luvisi
sumber
11
... dan dalam hal ini Anda dapat meninggalkan '.'
Adam Mitz
7
Untuk jalur absolut, gunakanfind $(pwd) -name \*.txt
Zags
2
Jika pola memiliki bagian dari nama direktori harus digunakan -path "*docs/*.txt"sebagai ganti -name. -wholenamesama seperti-path
dashesy
9
Gunakan -type funtuk hanya mengembalikan file dan bukan direktori, tautan simbolik, dll.
pengguna
2
-name "*.txt"TIDAK akan cocok file.TXT- selalu gunakan -iname "*.txt"yang case-sensitive.
ccpizza
73

Gunakan tree, dengan -f(jalur penuh) dan -i(tanpa garis lekukan):

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

Anda kemudian dapat menggunakan grepuntuk menyaring yang Anda inginkan.


Jika perintah tidak ditemukan, Anda dapat menginstalnya:

Ketik perintah berikut untuk menginstal perintah pohon di RHEL / CentOS dan Fedora linux:

# yum install tree -y

Jika Anda menggunakan Debian / Ubuntu, ketik Linux Mint dengan perintah berikut di terminal Anda:

$ sudo apt-get install tree -y
Stephen Irons
sumber
2
pengaturan untuk daftar file saja, dan mengecualikan folder?
thebugfinder
25

Coba find. Anda dapat mencarinya persis di halaman manual, tapi agak seperti ini:

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

jadi untuk contoh Anda

find . -name "*.txt"

harus memberi Anda apa yang Anda inginkan.

Jonathan Adelson
sumber
9

Anda bisa menggunakan find sebagai gantinya:

find . -name '*.txt'
Sherm Pendley
sumber
5

Begini caranya:

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

Tapi itu dilakukan dengan "berbuat dosa" dengan penguraian ls, yang dianggap bentuk buruk oleh komunitas GNU dan Ghostscript.

El Guesto
sumber
2
@CAFEBABE: dianggap tabu untuk menguraikan hasil lskarena biasanya mengarah ke bug. Kalimat tersebut mencoba untuk memanggilnya. Itu juga memiliki lelucon di dalamnya yang telah saya hapus.
Adam Katz
4
DIR=your_path
find $DIR | sed 's:""$DIR""::'

'sed' akan menghapus 'your_path' dari semua hasil 'find'. Dan Anda menerima relatif terhadap jalur 'DIR'.

h-dima
sumber
ini persis apa yang saya butuhkan tetapi masih memuntahkan path lengkap untuk saya?
v3nt
1
jangan gunakan tanda kutip - find / tmp | sed s: "/ tmp" :: | lebih
Kieren Dixon
4

Untuk mendapatkan nama file path lengkap aktual dari file yang diinginkan menggunakan perintah find, gunakan dengan perintah pwd:

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

Berikut ini skrip 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();

pemakaian:

ls -LR | perl format_ls-LR.pl
Eric Keller
sumber
Ini adalah program Perl yang mengerikan. Mungkin 2-3 kali lebih lama, dan rumit, dari yang seharusnya.
Brad Gilbert
1

Anda dapat membuat fungsi shell, misalnya di Anda .zshrcatau .bashrc:

filepath() {
    echo $PWD/$1
}

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

Yang pertama hanya bekerja pada satu file saja.

rxw
sumber
1

Temukan file yang disebut "nama file" pada sistem file Anda memulai pencarian dari direktori root "/". "Nama file"

find / -name "filename" 
pengguna2101432
sumber
1

Jika Anda ingin menyimpan detailnya datang dengan ls seperti ukuran file dll di output Anda maka ini harus bekerja.

sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file
rajeshk
sumber
1

Di shell ikan , Anda dapat melakukan ini untuk mendaftar semua pdf secara rekursif, termasuk yang ada di direktori saat ini:

$ ls **pdf

Hapus saja 'pdf' jika Anda ingin file jenis apa pun.

rien333
sumber
0

Anda dapat mengimplementasikan fungsi ini seperti ini.
Pertama, menggunakan perintah ls yang diarahkan ke direktori yang ditargetkan. Kemudian menggunakan perintah find, saring hasil dari itu. Dari kasus Anda, sepertinya - selalu nama file dimulai dengan sebuah kata file***.txt

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

Di mycase, dengan perintah pohon

Jalur relatif

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

Jalan absolut

tree -ifF ./dir | grep -v '^./dir$' | grep -v '.*/$' | grep '\./.*' | while read file; do
  echo $file | sed -e "s|^.|$PWD|g"
done
Matsumoto Kazuya
sumber