Dosya adı uzunluğuna göre dosyaları bulma


10

Tüm dosyaları dosya adlarının uzunluğuna göre bulmak istiyorum.

Mesela ben gibi uzunluğu 1 dosyaları bulmak istiyorsanız a.go, b.go.

Koydum:

grep '.\{1\}' file

Ancak bu işe yaramıyor. Dosyaları dosya adı uzunluğuna göre bulmak için hangi komutu kullanabilirim?


a.go4 uzunluğunda abir dosya adıdır. 1 uzunluğunda bir dosya adıdır. Bu, ad ve uzantı ayrı olan ve örtük .olan her zaman dosya adının bir parçası olan DOS değil, Unix'tir .
Peter Cordes

Yanıtlar:


3

grepdosyaların içeriğinde kalıp arar. Dosyaların adlarına bakmak istiyorsanız, sadece bir kabuk glob kullanabilirsiniz (sadece geçerli dizindeki dosya adlarını dikkate almak istiyorsanız):

echo ?.go

(Bu arada, echokomutu değil, glob'u değerlendiren kabuk .)

Geçerli dizinden başlayarak dizinlere özyinelemeli olarak bakmak isterseniz, kullanılacak araç find:

find . -name '?.go'

(Kabuğun findçağrılmadan önce kabuğun bir glob olarak değerlendirilmesini önlemek için deseni alıntılamanız gerektiğini unutmayın .)


1
Bu ayrıca '? .Go' kalıbıyla da eşleşen dizinleri bulur.
slm

@slm, dizinler birçok dosya türünden biridir, OP daha sonra ne tür dosyalar olduğunu belirtmedi.
Stéphane Chazelas

8

Sadece dosya adlarını bulmak istiyorsanız, aşağıdaki komutu kullanabilirsiniz:

find -exec basename '{}' ';' | egrep '^.{100,}$'

Bu, çalışarak finddosya veya dizinin adını çekerek çalışır basenameve daha sonra en az 100 karakter olan dosya adını veya dizin adını arar. Tam uzunlukta bir dosya adı bulmak istiyorsanız, {100}yerine kullanın {100,}.

Yolu içeren dosya adlarını bulmak istiyorsanız, şunu yapın:

find | egrep '/[^/]{100,}$'

Bu, find komutunu çalıştırdığınız göreli yolu içeren dosya adını döndürür.


3

Her şeyden önce, dosyaların içeriğinigrep arar , dosya adlarını aramaz. Bunun için . Dosya adı uzunluğunu ayarlama seçeneği yoktur, ancak istediğinizi elde etmek için çıktısını ayrıştırabilirsiniz. Aşağıdaki dosyaları içeren bir dizinde çalıştırdığım bazı örnekler:find

$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
    ├── a
    ├── ab
    ├── abc
    └── abcd

Bu dizindeki dosyaları aramak şunları döndürür:

$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd

Bu nedenle, X uzunluğundaki dosyaları bulmak için yolu kaldırmamız ve yalnızca sonuncudan sonraki karakterlerle eşleşmemiz gerekecek /:

 $ find . -type f | grep -P '/.{3}$'

sedKomut sadece kaldırır ./. -PBayrak için gerekli olan Perl Uyumlu Düzenli İfadeler aktive {n}bir PCRE şey ve hangi $vasıta "dizesinin sonuna maç".

Ayrıca bunu kolayca yapabilirsiniz:

find . -type f | grep -P '/...$'

15 sayı uzunluğundaki dosya adlarını eşleştirmek için 15 nokta yazarak küçük sayılar için bu çok verimli değildir.

Son olarak, uzantıyı yok saymak ve yalnızca dosyanın adıyla eşleşmek istiyorsanız, bunu yapın (@slm'nin önerdiği gibi):

find . -type f | grep -P '/.{1}\.'

Ancak, bu aynı zamanda dosyaları bulur a.bo.go. Dosya adlarınız birden fazla içeriyorsa bu daha iyidir .:

find . -type f | grep -P '/.{1}\.[^.]+$'

NOT: Yukarıdaki çözüm, yeni satır karakterleri vb. İçermeyen nispeten aklı dosya adlarına sahip olduğunuzu varsayar. Ayrıca, istediğiniz şey olmayabilir uzunluğu hesaplarken dosya adlarındaki boşlukları dikkate almaz. Bunlardan herhangi biri bir sorunsa, bana bildirin, cevabımı güncelleyeceğim.


1

Belirtmezsiniz, ancak dosyalar bir dizin yapısındaysa find, uzunluğu 1 olan dosyaları bulmak için kullanabilirsiniz grep:

$ find . -type f  | grep -P '/.{1}\.'

Misal

$ find . -type f  | grep -P '/.{1}\.' | head -10
./util-linux-2.19/include/c.h
./88366/a.bash
./89186/a.bash
./89563/b.txt
./89563/a.txt
./89563/c.txt
./89563/d.txt
./91734/2.c
./91734/4.c
./91734/1.c

MacOS X'te egrep kullanın ve -P seçeneğini kaldırın
Bart Kummel

@BartKummel - aslında OSX'te kullanıyorum ggrep: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . Ayrıca, bu Q'nun OSX olarak etiketlenmediğini ve dolayısıyla kullanımının grepuygun olduğunu unutmayın.
slm

1

Böyle bir şey kullanırdım.

find . -type f -name "?.go"

Eğer iki "?" iki karakter ve uzantıya sahip dosya adları arıyorsunuz.


0

Find komutunda normal exxpression kullanmak istediğinizde şunu kullanmalısınız "":

find /var/log -iname "*.err" 

yor durumda kullanımı için:

find yourpath -type f -a -name "?.go"

Gerçek yolunuzu yolunuzla değiştirmeniz gerekir, -ayani And -type fsadece normal dosyaları aradığınız anlamına gelir.

? sorgunuz hatırlarsanız DOS gibi bir karakter anlamına gelir.


-1

ls ?.* size istenen sonuçları vermelidir.


Unix.SE'ye hoş geldiniz. Maalesef zaten çok sayıda iyi cevabı olan eski sorulara cevap eklemek yararlı değildir. (Eski bir sorunu çözmenin yeni ve daha iyi bir yolu yoksa veya eski yanıtların herhangi birinden daha iyi bir çözümünüz yoksa.) Bazı soruları cevaplamak istiyorsanız, ön sayfadaki yeni sorulara bakın.
Peter Cordes
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.