Gizli dosya ve dizinleri joker karakterli bir “bulma” aramasında nasıl hariç tutulur / yok sayılır?

97

Buradan başlayarak ( joker karakterlerden önce ve sonra "bir metin") dikkat edin

find . -type f -name '*some text*'

Tüm gizli dosyaları ve dizinleri nasıl hariç tutabilir / yok sayabiliriz?

Zaten çoktan çok uzun zamandır googlededim , -prey ve! (ünlem işareti) parametreleri, ancak uymayan (ve uyuşmayan) bir örnek yeni çalışmış .

.

Borulama | - grep bir seçenek olabilir ve bunun örneklerini de memnuniyetle karşılarım; ama öncelikli olarak Kısa bir tek-liner (ya da aynı komut satırı hedefine ulaşmak için farklı yollar gösteren bir çift bağımsız tek-astar) ile ilgileniyorum. sadece find ’i kullanarak.

ps: Linux'ta dosyaları bulun ve belirli dizinleri hariç tutun yakından ilişkili görünüyor, ama a) henüz kabul edilmedi ve b) ilgili ama farklı ve farklı, ama c) ilham verebilir ve karışıklığı saptamaya yardım edebilir!

Düzenle

find . \( ! -regex '.*/\..*' \) -type f -name "whatever" , çalışır. Regex "bir şey, sonra eğik çizgi, sonra bir nokta, sonra her şey" (yani, alt klasörleri de dahil olmak üzere tüm gizli dosya ve klasörler) ve "!" regex'i reddeder.

    
sordu nutty about natty 10.03.2013 12:58

6 cevap

3

yanıt Asıl soruma yukarıda asıl sorum olan "düzenle" olarak gönderdim:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever" , çalışır. Regex, "bir şey, sonra eğik çizgi, sonra bir nokta, sonra her şey" (yani, alt klasörleri de dahil olmak üzere tüm gizli dosyalar ve klasörler) ve "!" regex'i reddeder.

    
verilen cevap nutty about natty 11.08.2015 09:31
108

Bu, dizininin soyundan gelen tüm dosyaları, gizli dosyaları ve dizinleri atlayarak yazdırır:

find . -not -path '*/\.*'

Yani, adında some text içeren bir dosya arıyorsanız ve gizli dosyaları ve dizinleri atlamak istiyorsanız, şunu çalıştırın:

find . -not -path '*/\.*' -type f -name '*some text*'

Açıklama:

-path seçeneği, bir yolu tüm yol dizesine göre kontrol eder. * bir joker karakterdir, / bir dizin ayırıcıdır, \. bir noktadır (özel bir anlamdan kaçınmak için kaçması gerekir) ve * başka bir joker karakterdir. -not , bu sınama ile eşleşen dosyaları seçmemek demektir.

find 'nin, önceki komutta gizli dizinleri tekrar tekrar aramadan kaçınmak için yeterince akıllı olduğunu düşünmüyorum. Bu nedenle, hıza ihtiyacınız varsa, bunun yerine -prune kullanın:

 find . -type d -path '*/\.*' -prune -o -not -name '.*' -type f -name '*some text*' -print
    
verilen cevap Flimm 09.07.2013 18:30
6

Bu, BSD, Mac ve Linux'ta da doğru şekilde çalışan nokta dosyalarının hariç tutulduğu birkaç yöntemden biridir:

find "$PWD" -name ".*" -prune -o -print
  • $PWD yolunun ./ ile başlamaması için tam yolunu geçerli dizine yazdır
  • -name ".*" -prune , bir nokta ile başlayan ve ardından aşağı inmeyen tüm dosya veya dizinlerle eşleşir
  • -o -print , önceki ifade bir şeyle eşleşmediyse dosya adını yazdırmak anlamına gelir. % Co_de% veya -print değerini kullanmak, tüm diğer ifadelerin varsayılan olarak yazdırmamasına neden olur.
verilen cevap eradman 24.03.2016 14:51
4
find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)

Tüm gizli dizinler ve $ DIR altındaki gizli dosyalar hariç tutulur

    
verilen cevap guest 28.02.2014 01:49
3

Bunun için find kullanmanız gerekmiyor. Sadece, bu gibi kabuklu yıldızlarda globstar kullanın:

echo **/*foo*

veya

ls **/*foo*

**/ 'nin herhangi bir klasörü tekrarlı olarak temsil ettiği ve *foo* ' si adında foo 'si olan herhangi bir dosya.

Varsayılan olarak ls dosyası kullanılarak gizli dosyalar ve dizinler hariç dosya adları yazdırılır.

Etkinleştirilmiş globos yoksa, bunu shopt -s globstar ile yapın.

Not: Yeni bir globbing seçeneği Bash 4'te çalışır, zsh ve benzer kabuklar.

Örnek:

$ mkdir -vp a/b/c/d
mkdir: created directory 'a'
mkdir: created directory 'a/b'
mkdir: created directory 'a/b/c'
mkdir: created directory 'a/b/c/d'
$ touch a/b/c/d/foo a/b/c/d/bar  a/b/c/d/.foo_hidden a/b/c/d/foo_not_hidden
$ echo **/*foo*
a/b/c/d/foo  a/b/c/d/foo_not_hidden
    
verilen cevap kenorb 20.04.2015 11:49
1

find , -and ve -not gibi net mantık anahtarlarına sahiptir ve bunları iki kuralla eşleşen bir dosyayı bulmak için bunları avantajınıza kullanabilirsiniz:

$ touch non_hidden_file.txt .hidden_file.txt somethings/.another_hidden_file.txt                                                 

$ find . -type f -name '*hidden_file*' -and \( -not -name ".*" \)                            
./non_hidden_file.txt

Gördüğünüz gibi, find , her iki koşulla eşleşen dosya adlarını bulmak için iki kod -name '*hidden_file*' ve -and \( -not -name ".*" \) kullanır - dosya adı hidden_file ile bununla birlikte, ancak nokta olmadan. Parantezin önündeki eğik çizgileri not edin - parantez tanımlamak yerine parantezi find argümanları olarak tanımlamak için kullanılırlar (parantezin aksi halde eğik çizgi olmadan ne ifade ettiği)

    
verilen cevap Sergiy Kolodyazhnyy 16.05.2017 00:01

Etiketlerdeki diğer soruları oku