Geçerli dizine göre yolu ile Linux CLI'de dosyaları özyinelemeli olarak listeleme


225

Bu soruya benzer , ancak geçerli dizine göre yolu unix'te eklemek istiyorum. Aşağıdakileri yaparsam:

ls -LR | grep .txt

Tam yolları içermez. Örneğin, aşağıdaki dizin yapısına sahibim:

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

Yukarıdaki kod:

file.txt
file1.txt
file2.txt

Standart Unix komutlarını kullanarak geçerli dizine göre yolları dahil etmeyi nasıl sağlayabilirim?


4
Bu sadece ls bu özelliği eksik olduğunu gösterir.
Arjun Singri

1
Tüm bu çözümlerin gerektirdiği bir utanç findya da tree. Ben sadece sahip gibi görünen bir android cihaza ssh'ing lsve bu diğer araçların hiçbiri: /
Ponkadoodle

Yanıtlar:


305

Find kullanın:

find . -name \*.txt -print

GNU find kullanan sistemlerde, çoğu GNU / Linux dağıtımında olduğu gibi, -print'i dışarıda bırakabilirsiniz.


11
... ve bu konuda '.'
Adam Mitz

7
Mutlak yollar için şunu kullanınfind $(pwd) -name \*.txt
Zags

2
Desende dizin adının bir parçası varsa -path "*docs/*.txt"bunun yerine kullanılmalıdır -name. -wholenameile aynı-path
dashesy

9
-type fYalnızca dosyaları döndürmek için kullanın , dizinleri değil, sembolik bağlantıları vb. Kullanın .
Kullanıcı

2
-name "*.txt"olacak DEĞİL maç file.TXT- her zaman kullanmak -iname "*.txt"harf duyarsız olan yerine.
ccpizza

73

Kullanım treeile, -f(tam yol) ve-i (girinti çizgileri yok :

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

Sonra kullanabilirsiniz grep istediklerinizi filtrelemek için .


Komut bulunamazsa, yükleyebilirsiniz:

RHEL / CentOS ve Fedora linux'a ağaç komutunu yüklemek için aşağıdaki komutu yazın:

# yum install tree -y

Debian / Ubuntu kullanıyorsanız, terminalinize Mint Linux aşağıdaki komutu yazın:

$ sudo apt-get install tree -y

2
sadece dosyaları listelemek ve klasörleri hariç tutmak için herhangi bir ayar?
thebugfinder

25

Deneyin find. Tam olarak man sayfasında bakabilirsiniz, ancak şöyle sorta:

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

örnek için

find . -name "*.txt"

istediğini vermelisin.



5

Hile yapar:

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

Ancak bunu lsGNU ve Ghostscript toplulukları tarafından kötü form olarak kabul edilen ayrıştırma ile "günah" yaparak yapar .


2
@CAFEBABE: lsgenel olarak hatalara yol açtığı için sonuçlarını ayrıştırmak tabu sayılır . Söz konusu cümle bunu söylemeye çalışıyordu. Ayrıca kaldırdığım bir şaka vardı.
Adam Katz

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

'sed', 'sizin_yolunuzu' tüm 'bul' sonuçlarından silecektir. Ve 'DIR' yoluna göre alıyorsunuz.


Bu tam olarak ihtiyacım olan şey ama yine de benim için tam yolu tükürüyor?
12'de v3nt

1
kesme işaretini kullanma - find / tmp | sed s: "/ tmp" :: | daha fazla
Kieren Dixon

4

Find komutunu kullanarak istenen dosyaların gerçek tam yol dosya adlarını almak için pwd komutuyla kullanın:

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

1

İşte bir Perl betiği:

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();

kullanımı:

ls -LR | perl format_ls-LR.pl

Bu korkunç bir Perl programı. Muhtemelen olması gerekenden 2-3 kat daha uzun ve karmaşıktır.
Brad Gilbert

1

Bir kabuk işlevi oluşturabilirsiniz, örneğin sizin .zshrcveya .bashrc:

filepath() {
    echo $PWD/$1
}

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

İlki sadece tek dosyalar üzerinde çalışacaktı.


1

"/" Kök dizininden aramaya başlayarak dosya sisteminizde "dosyaadı" adlı dosyayı bulun. "Dosya adı"

find / -name "filename" 

1

Çıktılarınızda dosya boyutu vb gibi ls ile birlikte ayrıntıları korumak istiyorsanız, o zaman bu çalışması gerekir.

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

1

In balık kabuğu, geçerli dizinde olanlar dahil, ardışık tüm PDF'leri listelemek için bunu yapabilirsiniz:

$ ls **pdf

Herhangi bir tür dosya istiyorsanız 'pdf' dosyasını kaldırmanız yeterlidir.


0


Hedeflenen dizine işaret eden ls komutunu kullanarak öncelikle bu işlevi uygulayabilirsiniz . Daha sonra find komutunu kullanarak sonucu filtreleyin. Davanızdan, kulağa böyle geliyor - her zaman dosya adı bir kelimeyle başlar file***.txt

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

0

Mycase'de ağaç komutuyla

Göreceli yol

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

Kesin yol

tree -ifF ./dir | grep -v '^./dir$' | grep -v '.*/$' | grep '\./.*' | while read file; do
  echo $file | sed -e "s|^.|$PWD|g"
done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.