Herhangi bir dizinden dosya nasıl bulunur


22

Book1 adlı bir dosya aramaya çalışıyorum .

Benim testte yukarıda belirtilen dosyayı aramaya çalışıyorum ve bu testte, dosyanın nerede olduğunu bilmiyorum.

Denedim find / -iname book1ama çıktı yok.

Dosyanın nerede olduğunu bilmiyorsam, book1 adlı dosyamı komut satırını kullanarak nasıl bulabilirim?

DÜZENLE:

Senaryom aşağıda daha ayrıntılı olarak açıklanmaktadır:

  1. Dosya uzantısı bilinmiyor
  2. Tam ad (büyük harf, rakam vb.) Bilinmiyor
  3. Dosyanın konumu bilinmiyor

2
Adında bir dosya varsa Book1ve okuyabileceğiniz bir dizindeyse, dosyayı find / -iname book1bulur. Gerçekten olduğundan emin misiniz Book1, değil Book1.xyzmi?
Fox

.Bp2 ​​dosyasının tam adı Book1.gnumeric'dir. Dosyanın tam adını belirtmem gerektiğini mi söylüyorsun? Bazı nedenlerden dolayı, bu özel komut için tek ihtiyacım olan dosyanın genel adı olduğunu düşündüm. Örneğin, dosya uzantısını hatırlamıyorum ve aradığım dosyanın adını sadece bir tür biliyorum, testim bir dosya bulmaya çalışıyor. Tavsiye lütfen.
Aspire27

@don_crissti Tamamlandı. Lütfen yukarıdaki Düzenle'ye bakın.
Aspire27

Sen karıştırıyorsun find ve locate. locatecömerttir ve normalde günlük olarak güncellenen veritabanında olduğu sürece eşleşen her şeyi bulur. find, bu durumda, bir dosya küresi, kullanacağınız desen türünü arıyor ls. Muhtemelen demek istiyorsun iname '*book1*'. Kabuğun onu görmeden genişlemesini durdurmak için desen tırnak içinde olmalıdır find. Ayrıca find, birçok * nix komutu gibi, başarısız olduğunda da sinir bozucu bir şekilde sessiz olduğunu unutmayın.
Manngo

Yanıtlar:


31

İlk olarak, bir argüman -inamekabuk kalıbıdır . Desenler hakkında daha fazla bilgiyi Bash kılavuzunda bulabilirsiniz . Burada esas olarak, bir dosyayı findgerçekten bulabilmek için dosya adının belirtilen kalıpla eşleşmesi gerekir. Büyük / küçük harfe duyarlı olmayan bir dize book1eşleşmesi yapmak Book1.gnumericiçin şunu eklemeniz *gerekir:

find / -iname 'book1*'

veya tam adı belirtin:

find / -iname 'Book1.gnumeric'

İkincisi, -inameyapacak findbelirttiğiniz eğer öyleyse dosya davayı görmezden -iname book1o da bulabilir Book1, bOok1sen denir aradığınızdan emin dosya iseniz vb Book1.gnumeric kullanmayın sonra -inameama -namedaha hızlı olacak,:

find / -name 'Book1.gnumeric'

Üçüncü olarak, diğer cevapta belirtildiği gibi deseni alıntılamayı unutmayın .

Ve son olarak, dosyayı sisteminizin her yerinde aramak istediğinizden emin misiniz ? $HOMEÜzerinde çalışıyorsanız veya bir yerden indirdiyseniz , aradığınız dosyanın dizininizde olması mümkündür. Yine, bu çok daha hızlı olabilir.

DÜZENLE :

Sorunuzu düzenlediğinizi fark ettim. Tam dosya adını, büyük / küçük harf kullanımını ve yerini bilmiyorsanız, bunun gibi bir şey kullanmalısınız:

find / -iname 'book1*'

Ben de kök olmayan bir kullanıcı olarak çağırırsanız mevcut 2>/dev/nulltüm *permission denied*ve diğer hataları gizlemek için satırın sonuna koyarak öneririz find:

find / -iname 'book1*' 2>/dev/null

Tek bir dosya aradığınızdan eminseniz ve sisteminizde find, ilk eşleşen dosyayı bulduktan sonra çıkmanız gereken ölçütlere uyan yalnızca tek bir dosya varsa :

find / -iname 'book1*' -print -quit 2>/dev/null


6

locateKomutu deneyebilirsiniz . Aramayı daha hızlı hale getirmek için bir dosya adları veritabanı kullanır.

Tüm dosya eşleşmelerini aramak *book1*ve büyük / küçük harf kullanımını göz ardı etmek için şunu kullanabilirsiniz:

locate -i book1

ile başlayan dosyaları aramak istiyorsanız book1, joker karakteri kendiniz yapmanız gerekir:

locate -i 'book1*'

Bundan daha hızlıdır find, ancak veritabanının en son yenilendiği tarih kadar günceldir.


5

book1.somethingDosya konumunun, tam değerinin somethingve büyük / küçük harf kullanımının bilinmediği bir dosyanız olduğunu biliyorsanız :

find / -iname 'book1.*'

Kesin olarak bildiğiniz tek şey dosya adının kelimeyi içermesi durumunda book, daha büyük bir liste oluşturabilirsiniz.

find / -iname '*book*'

Argümanı -namebir kabuk glob paternidir. Dosyanın bulunduğu dizinden karşılaştırın:

$ ls Book1
ls: cannot access 'Book1': No such file or directory
$ ls Book1.*
Book1.gnumeric

Bu, tarafından yapılan arama türünü temsil eder -name. -inameSeçenek sadece bu bir harf duyarsız bir sürümünü sağlar.


1

POSIXly,

LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'

Adı içerdiği tüm dosyaların yolunu bildirir book1(davanın herhangi bir varyasyonu ile, ancak yalnızca ASCII latin karakterleri dikkate bokBOKgibi Unicode'da değil diğer birçok varyasyonu 𝗄, 𝚔, 𝘬, , , , ve tüm varyasyonları ... aksan ile) içinde okuma erişimine sahip olduğunuz tüm dizinler.


0

Bu tür görevler için her zaman yaparım: find / -iregex '.*Book1.*'

Bu form, senaryonuzun 3 noktasını halleder ( iregexbüyük / küçük harf duyarsız rasyonel bir ifadedir ve .*her iki taraftaki desen, sabit Kitap1 modelinizden önce ve sonra herhangi bir karakterle eşleşir - bu açıkça size gereğinden fazla sonuç verebilir. ancak dosyayı kaçırmayacağınızdan emin olabilirsiniz)

Temel fark: mümkünse, sadece kullanmaktan daha kısıtlayıcı /sadece çalışıyor gibi, /homeaksi takdirde ilgili olmayan bazı dizinleri inecek, ya da öyle ( /sys, /devvb ...)

Ancak Unix izinlerinin geçerli olduğunu unutmayın: dosya, findkomutu çalıştıran kullanıcının erişim (yürütme) hakkına sahip olmadığı bir dizindeyse, finddosyayı orada bulamaz.


iregex Solaris (OS belirtilmemiş) (ve muhtemelen * BSD) gibi yerlerde çalışmaz, bu bir GNU oluşumudur ve standardın birfind
Gert van den Berg

0

Silver Searcher , dosyaları ve içeriği aramak için çok hızlı ve kullanışlı bir araçtır.

Sorununuzu çözmek için gümüş arama komutu şöyle görünecektir ...

ag -g Book1

-g PATTERN PATTERN ile eşleşen dosya adlarını yazdırın


0

locate ve değişkenleri hızlı bir yöntem olma eğilimindedir.

# updatedb # run as root, possibly using sudo, e.g. sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped
$ locate -i book1

Konum bulma kullanılamıyorsa, findbunun yerine kullanabilirsiniz . Çok daha yavaş, ama aynı zamanda çok daha kesin olma eğilimindedir.

Tek bir bölümünüz varsa: (kullanıcınızın dosyaya erişimi olmayabilirse root olarak çalıştırın)

$ find / -xdev -iname 'book1*' -print # If the iname extension to find is available
$ find / -xdev -print | grep -F -i /book1 # if iname is not available

Özellikle -xdev findbölüm değilseniz, ekranınızı hatalarla doldurma eğilimi olan /procve gibi diğer bölümlerde arama yapmazsanız /sys. (Hatalar 2> /dev/nullfind komutunun sonuna eklenerek gizlenebilir (yorum kaldırılmalıdır))

Birden çok bölümünüz varsa ve dosyanın hangisinde olduğunu bilmiyorsanız, lsblk(Linux tabanlı işletim sistemlerinde, dfçıktıyı ayrıştırmak başka bir seçenektir) ile bir liste alabilir ve bunu find: (eğer dosyaya erişip erişemeyeceğinizi bilmiyorum)

$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname 'book1*' -print # GNU-based OSes
$ find $(df -P|awk '$1 ~ /^\/dev/ {print $NF}') -xdev | grep -F -i book1 # Non-GNU based OSes.

(Bağlanma noktalarınızdan herhangi birinde boşluk varsa bu biraz kırılgandır) ( dfparametrelerin ayarlanması gerekebilir. -P, GNU'nun dfstandart POSIX çıkışı vermesini sağlar. Diğer sürümlerin başka parametreleri olabilir veya dışarıda kalması gerekebilir. Adam sayfanızı okuyun)

grep -FDışlayan başka şeyler takas bölümleri gibi, geri döndü.

GNU olmayan sürümde, awk, /devgerçek dosya sistemleri elde etmek için başlangıç noktası olan aygıtları bulur ve daha sonra dfçıkıştan son alanı (bağlama noktası) yazdırır .

Bu ayrıca, bourne benzeri bir kabuk olduğunu varsayar ( kshve bashçalışmalıdır. Bir cshvaryant kullanıyorsanız , bunu denemeden önce komut dosyasılanabilir bir kabuk başlatın )


grepLer biraz gürültülü olabilir, bunu süzmek öğrenmek daha iyi (bu örnekte ile gerekli olmamalıdır, ama baktım aldığı daha yaygın bir şeyse, greps gürültü seviyesini düşük tutmak için ayarlama gerekir)
Gert van den Berg

0

ag (gümüş arama) dosyalarda çok hızlı arama sağlar ve ayrıca dosya adı arama seçeneğine de sahiptir:

>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m0.884s
user    0m0.701s
sys     0m0.178s

>: time find . -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m29.744s
user    0m2.108s
sys     0m13.982s

>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m16.698s
user    0m1.951s
sys     0m7.119s

Bu yüzden benim kullanım durumumda dosya ag tarafından göz ardı edilen bir dosya değilse 30 kat daha hızlıdır.

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.