Linuxda xüsusi mətni olan bütün faylları necə tapmaq olar?

Müəyyən bir mətn xətti olan bütün fayllar üçün mənim bütün Linux sistemini tarama yolunu tapmağa çalışıram. Aydınlaşdırmaq üçün, mən faylda deyil, faylda mətn axtarıram.

Bunu necə edəcəyimi axtarıram, bu qərarı iki dəfə rastladım:

 find / -type f -exec grep -H 'text-to-find-here' {} \; 

Ancaq bu işləməyəcək. Göründüyü kimi, sistemin hər bir faylını göstərir.

Bunu doğru yola yaxınlaşdırmaq mı? Əgər yoxsa, mən necə edə bilərəm? Fayllarda mətn dizələrini tapmaq bacarığı mənim etdiyim bəzi proqramlaşdırma layihələri üçün son dərəcə faydalı olacaq.

4058
06 июня '13 в 11:06 2013-06-06 11:06 Nathan 6 iyun 'da 11:06' də təyin olunub 2013-06-06 11:06
ответ 41 cavab
  • 1
  • 2

Aşağıdakıları et:

7355
06 июня '13 в 11:21 2013-06-06 11:21 Cavab rakib_ 06.06.2013 tarixində saat 11.21 -də verilir

Siz grep -ilR istifadə edə bilərsiniz:

 grep -Ril "text-to-find-here" / 
border=0
  • i ixtiyari yoxdur (ixtiyari haldır).
  • R özü recursive deməkdir.
  • l "nəticəin özü deyil, faylın adını göstərmək" deməkdir.
  • / avtomobilinizin kökündən başlayır.
1188
06 июня '13 в 11:08 2013-06-06 11:08 Cavab fedorqui tərəfindən verilir 06.06.13 11:08 2013-06-06 11:08

Ack istifadə edə bilərsiniz. Bu, mənbə kodu üçün grepə bənzəyir. Bütün fayl sisteminizi görə bilərsiniz.

Yalnız təqib edin:

 ack 'text-to-find-here' 

Kök dizinde.

Normal ifadələrdən istifadə edə bilərsiniz, fayl tipini və s.


ƏLAVƏ OLUNUB

Yalnız bir ack kimi olan Gümüş .gitignore , ancaq 3-5 qat daha sürətli və hətta .gitignore faylından şablonları .gitignore .

260
06 июня '13 в 11:26 2013-06-06 11:26 cavab 06 iyun 2013-cü il saat 11 : 26-da "EarlOfEgo" tərəfindən verilmişdir 2013-06-06 11:26

Siz istifadə edə bilərsiniz:

 grep -r "string to be searched" /path/to/dir 

r , özünü recursive deməkdir və buna görə də müəyyən edilmiş yolda, eləcə də onun alt qovluqlarında axtarış edəcəkdir. Bu faylın adını izah edər və xəttin göründüyü faylda satırı yazdırın.

Və ya bütün javascript faylları (* .js) axtarış üçün çalışırıq (məsələn :) bir komanda kimi:

 find . -name '*.js' -exec grep -i 'string to search for' {} \; -print 

Bu, mətnin göründüyü fayllarda xətləri yazacaq, ancaq faylın adı deyil.

Bu əmrlə yanaşı, bu da yaza bilərik: grep -rn "Search for string" / path / to / directory / və / file -r: recursive search n: line number matches for matches

145
15 марта '14 в 2:29 2014-03-15 02:29 Cavab larner_19 mart 15 '14 da 2:29 2014-03-15 02:29

Bunu istifadə edə bilərsiniz:

 grep -inr "Text" folder/to/be/searched/ 
89
31 июля '13 в 16:44 2013-07-31 16:44 cavab 31 iyul '13 'də saat 4:44' də verilir 2013-07-31 16:44

Müəyyən mətni olan fayl adlarının siyahısı

Hər şeydən əvvəl istifadə etdiyiniz -H - -l yerinə. Ayrıca tırnakların içərisində mətni əlavə etməyə cəhd edə bilərsiniz, sonra {} \ .

 find / -type f -exec grep -l "text-to-find-here" {} \; 

bir nümunə

Diyelim ki, dizininizdeki "Apache License" adlı xüsusi mətni olan faylları axtarırsınız. Aşağıdakı nəticələrə bir qədər oxşar nəticələr verəcəkdir (çıxış sizin kataloqunuzun məzmununa görə fərqlənəcək).

 bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; ./net/java/jvnet-parent/5/jvnet-parent-5.pom ./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom ./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom ./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom ./commons-codec/commons-codec/1.9/commons-codec-1.9.pom ./commons-io/commons-io/2.4/commons-io-2.4.pom bash-4.1$ 

Case həssaslığının aradan qaldırılması

"Mətn" və "TEXT" halda istifadə -i i-i keçidini görməməzlikdən istifadə edə bilərsiniz. Daha ətraflı məlumatı burada oxuya bilərsiniz .

Bu sizə kömək edir.

58
09 нояб. Cavab lkamal 09 noyabrda verilir. 2013-11-09 16:18 '13 'da 16:18' da 2013-11-09 16:18

grep recursive axtarışı dəstəkləmirsə, xargs ilə find birləşdirə find :

 find / -type f | xargs grep 'text-to-find-here' 

find -exec formatından daha xatırlamaq mənim üçün asandır.

Bu, məsələn, faylın adını və müvafiq xəttin məzmununu göstərəcəkdir.

 /home/rob/file:text-to-find-here 

grep əlavə edə bilərsiniz əlavə bayraqlar:

  • -i - halda həssas axtarış
  • -l - yalnız bir oyunun tapıldığı faylın adını göstərin.
  • -h - yalnız eşleşen satırı (fayl adını deyil)
48
20 июня '14 в 11:49 2014-06-20 11:49 Cavab RobEarl tərəfindən 20 İyun 2014 tarixində 11:49 2014-06-20 11:49 tarixində verilir

grep ( GNU və ya BSD )

Cari qovluğu təkrarlanan şəkildə axtarmaq üçün grep vasitəsini istifadə edə bilərsiniz, məsələn:

 grep -r "class foo" . 

Qeyd: -r - Axtarış alt kataloqlarını recursively.

Aşağıdakı kimi xüsusi faylları axtarmaq üçün globbing sintaksisindən istifadə edə bilərsiniz:

 grep "class foo" ***.* istifadə edə bilərsiniz **/*.* Bütün fayllar üçün (gizli istisna olmaqla) və ya başqa bir şablon. 

Sizin arqumentinizin çox uzun olduğuna dair bir səhv varsa, axtarış daralma və ya find sözdizimini istifadə edin:

 find . -name "*.php" -execdir grep -nH --color=auto foo {} ';' 

Alternativ olaraq ripgrep istifadə ripgrep .

ripgrep

Böyük layihələr və ya böyük fayllar üzərində ripgrep istifadə edin:

 rg "class foo" . 

GitHub layihəsi səhifəsində sənədlər, quraşdırma addımları və ya mənbə kodu üçün sifariş verin .

GNU / BSD grep , ucg , ag , ucg , ack , pt və ya oxşar kimi hər hansı digər alətdən daha sürətlidır, çünki tezliklə axtarış etmək üçün sonlu dövlət maşınları, SIMD və təcavüz ədəbiyyatlarını istifadə edən Pas normal ifadə mexanizminin üstündə quraşdırılmışdır,

Bu, .gitignore fayllarında göstərilən nümunələri görməməyi dəstəkləyir, belə ki, bir fayl yolu eyni anda bir neçə .gitignore .


Aşağıdakı kimi ümumi parametrlərdən istifadə edə bilərsiniz:

  • -i - həssas axtarış.
  • -i - İkili faylları görməyin.
  • -w - bütün sözləri axtarmaq (sözlərin qismən uyğunluğundan -w ).
  • -n - -n xəttini göstərin.
  • -C / --Context (məsələn, -C5 ) - Kontekstini artırır, beləliklə ətraf kodunu görürsünüz.
  • --Color=auto - --Color=auto qarşılıqlı mətn.
  • -H - mətnin tapıldığı faylın adını göstərir.
  • -C - uyğunluq xətlərinin sayını göstərir. -H ilə birləşə bilər.
41
09 мая '15 в 13:11 2015-05-09 13:11 cavab maye 09 may, saat 13:11 da verilir. 2015-05-09 13:11
 grep -insr "pattern" * 
  • i : PATTERN və giriş faylları hallarda fərqləri görməyin.
  • n : hər bir çıxış xəttinin ön faylını giriş faylı 1 nömrəli satır.
  • s : Qeyri-mövcud və ya okunmaz fayllar haqqında səhv mesajların silinməsi.
  • r : hər bir kataloqun bütün fayllarını recursively oxumaq.
38
26 февр. Cavab enfinet verildi 26 Fevral. 2016-02-26 08:47 '16 'da 8:47 2016-02-26 08:47

Keçir:

 find . -name "*.txt" | xargs grep -i "text_pattern" 
27
10 дек. Cavab 10 dekabrda verilir. 2014-12-10 08:47 '14 da 8:47 2014-12-10 08:47

Silversearcher yeni bir fayda var

 sudo apt install silversearcher-ag 

Git və digər VCS ilə yaxından işləyir. Bu yolla .git və ya başqa bir kitabda bir şey ala bilməyəcəksiniz.

Yalnız istifadə edə bilərsiniz

 ag -ia "Search query" 

Və bu vəzifəni sənə verəcək!

26
04 нояб. Cavab Neil Agarwal tərəfindən verilir 04 Noyabr. 2016-11-04 00:30 '16 'da 0:30' da 2016-11-04 00:30 'da

Istədiyiniz kataloqdan, yineleyici aşağıdan axtarış etmək üçün pwd istifadə edin.

 grep -rnw `pwd` -e "pattern" 

Update Siz istifadə etdiyiniz grep versiyasına asılı olaraq, pwd . Yeni versiyalarda . dizin belirtilmemişse, grep üçün varsayılan argüman kimi görünür. Beləliklə:

grep -rnw -e "pattern"

və ya

grep -rnw "pattern"

yuxarıda olduğu kimi eyni olacaq!

26
28 мая '16 в 15:47 2016-05-28 15:47 Cavab mahatmanich 28 may '16 saat 15:47 2016-05-28 15:47 verilir

Linuxda xüsusi mətni olan bütün faylları necə tapmaq olar? (...)

Bu qərarı iki dəfə rastladım:

find / -type f -exec grep -H 'text-to-find-Here' {} \;


Əgər nümunənizdə olduğu kimi istifadə etsəniz , grepgrep tərəfindən verilən grep icazələri ilə bağlı çox sayda mesajın qarşısını almaq üçün komandanın sonunda grep2>/dev/null əlavə edin ( --no-messages ) daha yaxşıdır:

 find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null 

Unix benzeri platformlarda - xüsusi mətni axtararkən grep ilə birgə - standart fayl axtarış vasitəsini tapın. Yeri gəlmişkən , tapmaq əmri tez-tez xargs ilə birləşdirilir.

Eyni məqsəd üçün daha sürətli və daha asan bir vasitə var - aşağıya baxın. Əlbəttə platformada mövcud olduqda onları yaxşılaşdırın:

Daha sürətli, daha asan alternativlər

RipGrep , sürətli axtarış aracıdır:

 rg 'text-to-find-here' / -l 

Silver Finder :

 ag 'text-to-find-here' / -l 

ack :

 ack 'text-to-find-here' / -l 

Qeyd Bir çox səhv mesajını gizlətmək üçün bu komutlara 2>/dev/null əlavə edə bilərsiniz.


Xəbərdarlıq : Əgər həqiqətən də onu qarşısını ala bilmirsənsə, uzun və səmərəsiz axtarışın qarşısını almaq üçün '/' (kök dizini) ilə axtarış etməyin! Buna görə də, yuxarıda göstərilən nümunələrdə, həqiqətən, axtarış etmək istədiyiniz yerə bağlı olaraq, "/" bir alt qovşaqın adını, məsələn "/ ev" ə əvəz etməlisiniz ...

20
25 нояб. Cavab Bludzee tərəfindən 25 noyabrda verilir. 2015-11-25 17:16 '15 'də 17:16' də yollanacaq

grep bir simli axtarır olmasa belə istifadə edilə bilər.

Yalnız işləyir

 grep -RIl "" . 

bütün mətn faylları yolunu yazır, yəni. yalnız yazdırılabilir simvolları ehtiva edir.

18
09 апр. Cavab Alex Jasmin tərəfindən verilir 09 apr. 2014-04-09 22:51 '14 at 10:51 pm 2014-04-09 22:51

Aşağıda bir fayl axtarmaq üçün istifadə edilə biləcək əmrlərin siyahısı göstərilir.

 grep "text string to search" directory-path grep [option] "text string to search" directory-path grep -r "text string to search" directory-path grep -r -H "text string to search" directory-path egrep -R "word-1|word-2" directory-path egrep -w -R "word-1|word-2" directory-path 
16
01 февр. Cavab Atul Arvind 01 fevral tarixində verilir. 2014-02-01 08:47 '14 'da 8:47 2014-02-01 08:47

Ümid edirəm bu kömək edir ...

Çıxış haqqında əlavə məlumat almaq üçün grep bitini genişləndirin, məsələn, mətnin aşağıdakı şəkildə yerinə yetiriləcəyi xəttin nömrəsini almaq üçün:

 find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext" 

Fayl tipi haqqında bir fikiriniz varsa, bu halda fayl tipi uzantılarını göstərməklə axtarışınızı .pas faylları:

 find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext" 

Seçimlərin qısa təsviri:

  • . mövcud kataloqdan tapıla bilər.
  • -name " *.* ": Bütün fayllar üçün (-name " *.pas " -o- *.pas " *.pas "): Yalnız *.pas OR *.dfm *.pas *.dfm və ya -o
  • -type f faylları aradığınızı göstərir
  • -print0 və digər tərəfdən --null (boru) faylın adını grep dən grep yə keçirərək, faylın adının keçməsinə imkan verən faylın adını verərək grep-nin yolunu və faylını bir xətt kimi işləməyə imkan verən, faylın hər bir boşluğuna bölünməsinə imkan verir.
14
28 янв. Gert van Biljon tərəfindən verilmiş cavab Yanvar 28 2015-01-28 09:42 '15 at 9:42 2015-01-28 09:42

Sadə tapşırıq rahat işləyə bilər. alias sizin ~/.bashrc :

 alias ffind find / -type f | xargs grep 

Yeni bir terminal başlayın və buraxın:

 ffind 'text-to-find-here' 
14
22 марта '17 в 15:30 2017-03-22 15:30 cavab 22 mart '15 , 15:30 'də 2017-03-22 15:30' a veriləcək

Keçir:

 find / -type f -exec grep -H 'text-to-find-here' {} \; 

bütün fayl sistemlərini axtaracaq, çünki / kök qovluğu.

Ev qovluğunu istifadə etmək üçün:

 find ~/ -type f -exec grep -H 'text-to-find-here' {} \; 

Mövcud qovluq üçün istifadə edin:

 find ./ -type f -exec grep -H 'text-to-find-here' {} \; 
13
04 мая '15 в 22:11 2015-05-04 22:11 cavab 04 may 2014- cü il tarixində saat 22:11 da istifadəçi tərəfindən 4863663 tərəfindən verilmişdir 2015-05-04 22:11
 find /path -type f -exec grep -l "string" {} \; 

Şərhlərin izahı

tapmaq, müəyyən bir yolun alt dizinlerindəki qovluq və linklər kimi faylları və digər obyektləri tapmaq imkanı verən bir əmrdir. Fayl adlarının meydana gəlməsi lazım olan bir maska ​​belirlemezseniz, dizindeki bütün nesneleri listeler.

 -type f specifies that it should proceed only files, not directories etc. -exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename 
13
02 июля '14 в 10:18 2014-07-02 10:18 cavab 02 iyul 2014 - il saat 10:18 da Vinod Joshi tərəfindən verilir 2014-07-02 10:18

Bu kimi bir şey edən bir Python skript yazdım. Bu yazının necə istifadə edildiyi.

 ./sniff.py path pattern_to_search [file_pattern] 

İlk path arqumenti, biz recursively axtarış edəcək olan kataloqudur. İkinci ardıcıllıq, pattern_to_search faylda tapmaq istədiyimiz bir ifadəsidir. Biz Python re kitabxanasında müəyyən edilmiş müntəzəm ifadə formatından istifadə edirik. Bu skriptdə bir simvol var . həm də yeni xəttə uyğundur.

Üçüncü file_pattern arqumenti isteğe bağlıdır. Fayl adı ilə işləyən başqa bir normal ifadəsidir. Yalnız bu normal ifadəyə uyğun olan fayllar nəzərdən keçiriləcəkdir.

Örneğin, Python fayllarını uzantı py ile py isterseniz, Pool( aşağıdakı sözcük Adaptor aşağıdakıları edəcəyəm:

 ./sniff.py . "Pool(.*?Adaptor" .*py ./Demos/snippets/cubeMeshSigNeur.py:146 ./Demos/snippets/testSigNeur.py:259 ./python/moose/multiscale/core/mumbl.py:206 ./Demos/snippets/multiComptSigNeur.py:268 

Və voila'da, əlaqəli faylların yolunu və bir oyunun tapıldığı xəttin sayını yaradır. Bir neçə oyun aşkar edildikdə, hər bir satır nömrəsi fayl adına əlavə olunacaq.

12
06 янв. Cavab Dilawar Jan 06 tərəfindən verilir 2014-01-06 15:56 '14 saat 15:56 2014-01-06 15:56

Silver Searcher müdhiş bir vasitədir, lakin ripgrep daha yaxşı ola bilər.

Linux, Mac və Windows-də işləyir və Hacker News-də bir neçə ay əvvəl yazılıb (Andrew Gallantın bloguna bir GitHub linki olan bir link var):

Ripgrep - yeni komanda satırı axtarış aracı

12
13 дек. 13 dekabr tarixində AAAfarmclub tərəfindən verilmiş cavab 2016-12-13 08:48 '16 'da 8:48' də 2016-12-13 08:48 'də

İstifadə edin:

 grep -c Your_Pattern * 

Bu, mövcud dizindəki faylların hər birində şablonunuzun neçə nüsxəsinin olduğunu bildirəcəkdir.

12
07 янв. cavab Dr_Hope 07 Yanvar verilir 2017-01-07 10:59 '17 saat 10:59 'da 2017-01-07 10:59

grep bunu nail olmaq üçün yaxşı dostudur.

 grep -r <text_fo_find> <directory> 

bir mətn axtarış halda lazım deyilsə, istifadə edin

 grep -ir <text_to_find> <directory> 
11
24 окт. cavab 24 saat Prash verilir . 2017-10-24 06:07 '17 'də saat 6:07' də 2017-10-24 06:07

Simli tapmaq və yalnız bu simli axtarış simli ilə göstərmək üçün:

 for i in $(find /path/of/target/directory -type f); do grep -i "the string to look for" "$i"; done 

məsələn:

 for i in $(find /usr/share/applications -type f); \ do grep -i "web browser" "$i"; done 

Axtarış stringini ehtiva fayl adını göstərmək üçün:

 for i in $(find /path/of/target/directory -type f); do if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done; 

məsələn:

 for i in $(find /usr/share/applications -type f); \ do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \ fi; done; 
10
25 янв. cavab user3124504 25 yanvar tərəfindən verilir . 2014-01-25 14:08 '14 14:08 2014-01-25 14:08

Aşağıdakı əmr bu yanaşma üçün böyükdür:

 find ./ -name "file_pattern_name" -exec grep -r "pattern" {} \; 
10
12 дек. Cavab 12 dekabrda Pradeep Goswami tərəfindən verilir. 2015-12-12 09:14 '15 'da 9:14' de, 2015-12-12 09:14

Aşağıdakıları cəhd edin:

 find . | xargs grep 'word' -sl 
9
15 дек. Cavab Tayab Hüseyn tərəfindən 15 dekabr. 2014-12-15 13:10 '14 'da 13:10 2014-12-15 13:10

Mənə nə bəxtiyardır, nə qədər sadə gül "rl"

 grep -rl 'pattern_to_find' /path/where/to/find -r to find recursively file / directory inside directories.. -l to list files matching the 'pattern' 

Şablon tapıldığı mətnin ardından fayl adlarını görmək üçün 'l' olmadan '-r' istifadə edin!

 grep -r 'pattern_to_find' /path/where/to/find 

Yalnız yaxşı işləyir.

Bu kömək edir!

9
08 авг. Cavab verilir nitinr708 08 aug. 2017-08-08 12:38 '17 at 12:38 pm 2017-08-08 12:38

Aradığınız şeyi dəqiq bir şəkildə yerinə yetirəcək bir vasitədir.

http://linux.die.net/man/1/ack

 ack -i search_string folder_path/* 

Siz böyük -i axtarış üçün i-yə baxa bilərsiniz.

9
17 авг. cavab Pal 17 aug verilir . 2016-08-17 06:31 '16 'da 6:31 ' də 2016-08-17 06:31 'də

Bütün əvvəlki cavablar grep və tapın. Amma başqa bir yol var: gecə yarısı komandanını istifadə edin

Bu, qrafik interfeysi olmayan, görsel olan pulsuz bir proqramdır (30 il, vaxt testi). Bu çox funksiyaları var, fayl axtarışları onlardan biridir.

9
22 июня '17 в 19:27 2017-06-22 19:27 cavab 22 iyun 17: 27-də Peter M. tərəfindən verilmişdir 2017-06-22 19:27

Faylın adına ehtiyac olmadığı üçün, aşağıdakı bütün əmrləri istifadə edə bilərsiniz, ancaq bütün fayllardan axtarış etmək istəyir. Burada "TEXT" şəklini alıram. Faylın adı yazılmadığını təsdiq edən bütün fayllar

 grep -e TEXT *.log | cut -d' ' --complement -s -f1 

grepe-e seçimi PATTERN eşleme üçün olduğu kimi başqa bir seçim ilə müqayisədə olduqca sürətli

9
26 июня '15 в 14:31 2015-06-26 14:31 Cavab Mitul Patel tərəfindən 26 iyun 'da 14:31' də verilir. 2015-06-26 14:31
  • 1
  • 2