grep
Tüm dizinleri ve alt dizinleri özyinelemeli olarak nasıl yaparım ?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
Redhat Linux'ta benim için çalışmıyor. "Eşleşme yok" hatası alıyorum.
grep
Tüm dizinleri ve alt dizinleri özyinelemeli olarak nasıl yaparım ?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
Redhat Linux'ta benim için çalışmıyor. "Eşleşme yok" hatası alıyorum.
Yanıtlar:
grep -r "texthere" .
İlk parametre aranacak normal ifadeyi temsil ederken, ikinci parametre aranması gereken dizini temsil eder. Bu durumda, .
geçerli dizin anlamına gelir.
Not: Bu GNU grep için geçerlidir ve Solaris gibi bazı platformlarda, eski uygulamanın aksine GNU grep'i özellikle kullanmanız gerekir. Solaris için bu ggrep
komuttur.
AIX 5.3
Örneğin gelen grep üzerinde çalışmaz .
İstediğiniz dosyanın uzantısını veya desenini biliyorsanız, başka bir yöntem --include
seçeneği kullanmaktır :
grep -r --include "*.txt" texthere .
Hariç tutulacak dosyalardan da bahsedebilirsiniz --exclude
.
Sık sık kod içinde arama yaparsanız, Ag (The Silver Searcher) grep'e çok daha hızlı bir alternatiftir, bu da kod aramak için özelleştirilmiştir. Örneğin, varsayılan olarak özyinelemeli ve listelenen dosyaları ve dizinleri otomatik olarak yok sayar .gitignore
, bu nedenle grep veya bulmak için aynı hantal dışlama seçeneklerini geçmeye devam etmeniz gerekmez.
=
Ubuntu'da iyi çalışıyor. Not: bunun gergin bir alan olması gerekiyordu, ancak SO işaretleme ayrıştırıcısı başarısız oldu.
grep
değil, sadece biliyorsun) için seçildi :)
--include "*.txt" --include "*.TXT"
Ayrıca:
find ./ -type f -print0 | xargs -0 grep "foo"
ama grep -r
daha iyi bir cevaptır.
find . -type f -exec grep "foo" '{}' \;
desteklenen yerlerde iyi çalışır.
find ./ -type f -print0 | xargs -0 grep "foo"
Şimdi her zaman kullanıyorum (Windows'ta GoW - Gnu ile Windows'ta bile ):
grep --include="*.xxx" -nRHI "my Text to grep" *
Bu, aşağıdaki seçenekleri içerir:
--include=PATTERN
Yalnızca dosya eşleşmesini arayan dizinlerdeki yineleme
PATTERN
.
-n, --line-number
Çıktının her satırına, girdi dosyasındaki satır numarası ile önek ekleyin.
(Not: phuclv ekler yorumlarda -n
böylece başarımı ciddi çok azalır bu seçeneği atlamak isteyebilirsiniz, böylece)
-R, -r, --recursive
Her dizinin altındaki tüm dosyaları özyinelemeli olarak okuyun; bu
-d recurse
seçenekle eşdeğerdir .
-H, --with-filename
Her eşleşme için dosya adını yazdırın.
-I
İkili bir dosyayı, eşleşen veri içermiyormuş gibi işleyin;
bu--binary-files=without-match
seçenekle eşdeğerdir .
Büyük / küçük harfe duyarlı olmayan sonuçlar istiyorsanız ' i
' ( -nRHIi
) ekleyebilirim .
Alabilirim:
/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43: 'git.hidden' => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21: $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32: $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20: protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170: * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176: return $this->hidden;
...
-R
seçenek nedeniyle özyineli olarak ) klasörlere uygular .
*
veya .
bir glob paternidir (kabuk tarafından yorumlanır): unix.stackexchange.com/a/64695/7490 . ' .
' nokta dosyaları veya nokta klasörleri de seçecektir (örneğin .git/
)
grep -rnI
ama sonra -n
performansı çok düşürdüğünü öğrendim, bu yüzden gerçekten gerektiğinde kullanıyorum ve normalde kullanacağım-rI
POSIX sistemlerinde, için -r
parametre bulamazsınız grep
ve grep -rn "stuff" .
çalışmazsınız, ancak find
komutu kullanırsanız :
find . -type f -exec grep -n "stuff" {} \; -print
Tarafından kabul edilen Solaris
ve HP-UX
.
-exec
seçeneği - sembol {}
şu anda tarafından bulunan dosya adına bir referanstır find
(bulduğumuz isimle bir şeyler yapmak olduğunu) aracı, aynı zamanda -exec
seçenek ile sonlandırılmalıdır ;
bu her çünkü (exec komutların biten işaretine) sembolü, ama Bu sembol bir kabuk kaçmak gerekir .. ve son olarak -print
seçeneği find
ekranda bulunan dosya adlarını yazdırmak için aracı sağlar .
**
grep -r
Çalışmaları kullanmak , ancak özellikle büyük klasörlerde aşırıya kaçabilir.
Daha pratik kullanım için, globbing sözdizimini ( **
) kullanan sözdizimi :
grep "texthere" **/*.txt
yalnızca desen seçili desene sahip belirli dosyaları açar. Bash +4 veya zsh gibi desteklenen mermiler için çalışır .
Bu özelliği etkinleştirmek için, çalıştırın: shopt -s globstar
.
Ayrıca bkz: Linux'ta belirli metin içeren tüm dosyaları nasıl bulurum?
git grep
Git sürüm kontrolü altındaki projeler için şunu kullanın:
git grep "pattern"
çok daha hızlı.
ripgrep
Daha büyük projeler için, ripgrep
dosyaları en hızlı şekilde selamlayan, dosyaları varsayılan olarak özyinelemeli:
rg "pattern" .
Rust'un arama işlemini çok hızlı hale getirmek için sonlu otomata, SIMD ve agresif gerçek optimizasyonları kullanan normal regex motorunun üzerine inşa edilmiştir . Ayrıntılı analizi buradan kontrol edin .
Aşağıdaki komutu files
kullanarak path
yinelemeli olarak içeren adını bulmak string
için aşağıdaki komutu kullanın UNIX
:
find . | xargs grep "searched-string"
için Linux
:
grep -r "searched-string" .
UNIX
sunucuda bir dosya bul
find . -type f -name file_name
LINUX sunucusunda bir dosya bulma
find . -name file_name
Sembolik bağlantıları değil, yalnızca gerçek dizinleri takip etmek istiyorsanız,
grep -r "thingToBeFound" directory
Sembolik bağlantıları ve gerçek dizinleri takip etmek istiyorsanız (sonsuz özyinelemeye dikkat edin),
grep -R "thing to be found" directory
Tekrar tekrar grep yapmaya çalıştığınız için, aşağıdaki seçenekler de sizin için yararlı olabilir:
-H: outputs the filename with the line
-n: outputs the line number in the file
Geçerli dizinde veya herhangi bir alt dizinde Darth Vader içeren tüm dosyaları bulmak ve dosya adını ve satır numarasını yakalamak istiyorsanız, ancak özyinelemenin sembolik bağlantıları izlemesini istemiyorsanız, komut
grep -rnH "Darth Vader" .
Eğer dizinde cat kelimesinin tüm sözlerini bulmak istiyorsanız
/home/adam/Desktop/TomAndJerry
ve şu anda dizindesiniz
/home/adam/Desktop/WorldDominationPlot
ve "kediler" dizesinin herhangi bir örneğinin dosya adını yakalamak istemiyorsanız ve özyinelemeyi bulursa sembolik bağlantıları izlemesini istiyorsanız, aşağıdakilerden birini çalıştırabilirsiniz
grep -RH "cats" ../TomAndJerry #relative directory
grep -RH "cats" /home/adam/Desktop/TomAndJerry #absolute directory
Kaynak:
"grep --help" çalıştırıyor
Bu cevabı okuyan ve onlara referansımla karışan herkes için sembolik bağlantılara kısa bir giriş: https://www.nixtutor.com/freebsd/understanding-symbolic-links/
ag bunu yapmanın en sevdiğim yoludur github.com/ggreer/the_silver_searcher . Temelde ack ile aynı şey ama birkaç optimizasyon ile.
İşte kısa bir ölçüt. Her testten önce önbelleği temizlerim (cf /ubuntu/155768/how-do-i-clean-or-disable-the-memory-cache )
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time grep -r "hey ya" .
real 0m9.458s
user 0m0.368s
sys 0m3.788s
ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ack-grep "hey ya" .
real 0m6.296s
user 0m0.716s
sys 0m1.056s
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ag "hey ya" .
real 0m5.641s
user 0m0.356s
sys 0m3.444s
ryan@3G08$ time ag "hey ya" . #test without first clearing cache
real 0m0.154s
user 0m0.224s
sys 0m0.172s
Bu çalışmalı:
grep -R "texthere" *
Bir dizin yapısındaki tüm dosyalarda belirli bir içerik arıyorsanız, find
ne yaptığınızı daha açık olduğu için kullanabilirsiniz :
find -type f -exec grep -l "texthere" {} +
Not o -l
(L downcase) metin içeren dosyanın adını gösterir. Eşleşmenin kendisini yazdırmak istiyorsanız bunu kaldırın. Veya -H
dosyayı eşleşmeyle birlikte almak için kullanın . Hep birlikte, diğer alternatifler:
find -type f -exec grep -Hn "texthere" {} +
Nerede -n
satır numarasını yazdırır.
find
her iki önlemek gereksiz kullanımına çözüm xargs
ve kullanımı +
yerine \;
sahip -exec
, böylece gereksiz işlem başlattı ton kaçınarak. :-)
Şu anki makinemdeki durumum için çalışan (Windows 7'de git bash):
find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"
Boşluklu yollar için -print0 ve -0 öğelerini daima unuturum.
EDIT: Tercih ettiğim araç artık bunun yerine ripgrep: https://github.com/BurntSushi/ripgrep/releases . Gerçekten hızlı ve daha iyi varsayılanlara sahip (varsayılan olarak özyinelemeli gibi). Orijinal cevabımla aynı örnek ama ripgrep kullanma:rg -g "*.cs" "content pattern"
grep -r "texthere" .
(sondaki ihbar süresi)
(^ kredi: https://stackoverflow.com/a/1987928/1438029 )
Açıklama:
grep -r "texthere" /
( tüm dizinleri ve alt dizinleri özyinelemeli olarak grep )
grep -r "texthere" .
( bu dizinleri ve alt dizinleri özyinelemeli olarak grep )
grep [options] PATTERN [FILE...]
[Seçenekler]
-R, -r, --recursive
Her dizinin altındaki tüm dosyaları yinelemeli olarak okuyun.
Bu,
-d recurse
veya--directories=recurse
seçeneğine eşdeğerdir .
$ grep --help
$ grep --help |grep recursive
-r, --recursive like --directories=recurse
-R, --dereference-recursive
ack
( http://beyondgrep.com/ )
2018'de kullanmak istiyorsunuz ripgrep
veya the-silver-searcher
alternatiflerden çok daha hızlı oldukları için.
İşte 336 birinci seviye alt dizini olan bir dizin:
% find . -maxdepth 1 -type d | wc -l
336
% time rg -w aggs -g '*.py'
...
rg -w aggs -g '*.py' 1.24s user 2.23s system 283% cpu 1.222 total
% time ag -w aggs -G '.*py$'
...
ag -w aggs -G '.*py$' 2.71s user 1.55s system 116% cpu 3.651 total
% time find ./ -type f -name '*.py' | xargs grep -w aggs
...
find ./ -type f -name '*.py' 1.34s user 5.68s system 32% cpu 21.329 total
xargs grep -w aggs 6.65s user 0.49s system 32% cpu 22.164 total
OSX, bu yükler ripgrep
: brew install ripgrep
. Bu yükler silver-searcher
: brew install the_silver_searcher
.
rg
, sıfırdan tekrarlayan bir grep komutunun birlikte kaldırılması üzerinde önemli bir kenarı vardır. Kullanımı rg
: rg foo
. Unix araçları kullanma: find . | xargs grep foo
. Ve dosyalarınızdan herhangi birinin içinde bir alıntı varsa, kullanmanız gerekir find . -print0 | xargs -0 grep foo
. Bunu yılda birkaç kez kullanırsanız hatırlayacak mısınız?
find . -type f -exec grep 'regex' {} +
Bu araçları herhangi bir düzenlilikle kullanırsanız hangisinin hatırlanması gerçekten kolay olduğunu unutuyorsunuz . Ama muhtemelen çalışmalıdır ctags
veya etags
sık şeyler bulmak gerekiyorsa kaynak ağacı oldu Neyse üzerinde.
IBM AIX Sunucumda (işletim sistemi sürümü: AIX 5.2) şunları kullanın:
find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \;
bu, dosyadaki yolu / dosya adını ve göreli satır numarasını aşağıdaki gibi yazdırır:
./inc/xxxx_x.h
2865: / ** Açıklama: stringYouWannaFind * /
neyse, benim için çalışıyor :)
Aşağıda, String
özyinelemeli bir ortamda Unix
ve Linux
ortamda arama komutu verilmiştir .
için UNIX
komutun geçerli:
find . -name "string to be searched" -exec grep "text" "{}" \;
için Linux
komutun geçerli:
grep -r "string to be searched" .
Mevcut bayrakların bir listesi için:
grep --help
Geçerli dizindeki normal ifade metninin tüm eşleşmelerini karşılık gelen satır numarasıyla döndürür :
grep -rn "texthere" .
Kök dizinden başlayarak karşılık gelen satır numarası ve yoksayma durumu ile birlikte texthere için tüm eşleşmeleri döndürür :
grep -rni "texthere" /
Burada kullanılan bayraklar:
-r
özyinelemeli -n
çıktı ile satır numarasını yazdır -i
davayı yoksaySanırım yazmaya çalıştığın şey bu
grep myText $(find .)
ve grep hit dosyalarını bulmak istiyorsanız bu başka bir şey olabilir
grep myText $(find .) | cut -d : -f 1 | sort | uniq
Bunu not et find . -type f | xargs grep whatever
Bulma ile eşleşen çok fazla dosya olduğunda, birçok çözümün "Uzun süre için bağımsız değişken listesi" hatalarında çalışacağını .
En iyi bahis, grep -r
ancak bu mevcut değilse, find . -type f -exec grep -H whatever {} \;
bunun yerine kullanın.
xargs
"Bağımsız değişken listesi çok uzun" sorunu için özellikle geçici bir çözümdür.
find . -type f | xargs -L 100 grep whatever
xargs
, bu davranışı kutudan çıkarmak üzere standartlaştırılmıştır. "Yardımcı xargs
program, komut satırı uzunluğunu, komut satırı çağrıldığında, birleştirilmiş argüman ve ortam listeleri ... {ARG_MAX} -2048 baytı aşmayacak şekilde sınırlayacaktır."
Aşağıda, belirli bir klasörün ($ 1) tüm alt klasörlerini (ve 1 $) grep
belirli dizede ($ 3) aramaları kullanarak ($ 2) yinelemeli (bash ve sh ile hafifçe test edilmiştir) işlev vardır :
$ cat script.sh
#!/bin/sh
cd "$1"
loop () {
for i in *
do
if [ -d "$i" ]
then
# echo entering "$i"
cd "$i"
loop "$1" "$2"
fi
done
if [ -f "$1" ]
then
grep -l "$2" "$PWD/$1"
fi
cd ..
}
loop "$2" "$3"
Çalıştırma ve örnek bir çıktı:
$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename