Bir dizindeki binlerce dosyayı bir dosyadaki yüzlerce dizeye nasıl grep


11

Bir grepifade oluşturmaya çalışıyorum ve bu beni öldürüyor. Ayrıca arguments list too longhatayı almaktan yoruldum . Bir dosyam var, hadi diyelim subset.txt. Belirli dizeleri olan yüzlerce satır içerir MO43312948. Nesne dizinimde binlerce dosya var ve dizeleri içeren tüm dosyaları subset.txtbaşka bir dizine kopyalamam gerekiyor .

Ben sadece nesneleri dizininden eşleşen dosyaları döndürmek için bu ile başlamaya çalışıyordu.

grep -F "$(subset.txt)" /objects/*

`` Bash: / bin / grep: Bağımsız değişken listesi çok uzun '' alıyorum


6
"$(subset.txt)"Komuta neden böyle koydun ? Bu, kablonuzu yürütecek komut ikamesi (bir komut veya komut dosyası gibi). subset.txt
JigglyNaga

Yanıtlar:


23

Bir dizini hedef olarak ve aşağıdakilerle grepbirlikte -Rbir girdi kalıpları dosyası olarak iletebilirsiniz -f:

  -f FILE, --file=FILE
          Obtain patterns from FILE, one per line.  If this option is used
          multiple  times  or  is  combined with the -e (--regexp) option,
          search for all patterns given.  The  empty  file  contains  zero
          patterns, and therefore matches nothing.

   -R, --dereference-recursive
          Read all files under each directory,  recursively.   Follow  all
          symbolic links, unlike -r.

Yani, sen aradığın:

grep -Ff subset.txt -r objects/

Eşleşen dosyaların listesini aşağıdakilerle alabilirsiniz:

grep -Flf subset.txt -r objects/

Son listeniz çok uzun değilse, şunları yapabilirsiniz:

 mv $(grep -Flf subset.txt -r objects/) new_dir/

Bu bir argument list too longhata döndürürse şunu kullanın:

grep -Flf subset.txt -r objects/ | xargs -I{} mv {} bar/

Dosya adlarınızda boşluk veya başka garip karakterler varsa (GNU varsayarak grep) kullanın :

grep -FZlf subset.txt -r objects/ | xargs -0I{} mv {} bar/

Son olarak, ikili dosyaları hariç tutmak istiyorsanız, şunu kullanın:

grep -IFZlf subset.txt -r objects/ | xargs -0I{} mv {} bar/

… Ya da mvher biri bir argümanla potansiyel olarak binlerce çağrıyı önlemek için : ... | xargs -0 mv -t bar/( seçeneği mvdesteklediğini varsayarak -t).
David Foerster

11

kullanım

grep -F -f subset.txt 

grep'e dosyadan okumasını söyle subset.txt.

dosyayı yürümek için find komutunu kullanabilirsiniz.

find . -type f -exec grep -F -f subset.txt {} \;

veya

find . -type f -exec grep -F -f subset.txt {}  +

Ek filtreleme yapmak findyerine kullanmanın bir avantajı -rvar mı?
phk

1
@phk grep -r, istenebilecek veya istenmeyecek normal dosyalara sembolik bağlantıları arar (aynı ağacın içinde işaretlerse, aynı dosyayı iki kez ararsınız ; dışarıda işaret ederse, olabilecek veya olmayacak bir dosyada istenir).
Gilles 'SO- kötü olmayı bırak'

Modern sürümleri grepsembolik bağlantılarla etkileşimlerini kontrol etme seçeneklerine sahiptir ( man grepmevcut sistem için özellikleri belirlemek için). Özyinelemeli , her dosyada ayrı ayrı çalışmaktan çok daha hızlı grepolacaktır . grepfind
Perry

1
@Perry bundan emin misin? Neden? Ayrıca, bu cevabın kullanıldığını unutmayın, bu -exec +yüzden dosyaları gruplayacak ve dosya başına bir grep çalıştırmayacaktır.
terdon

I ayakta durmak düzeltmek, ben farklı semantik farkında değildi -exec {} +vs -exec {} \;yeni hergün bir şeyler öğrenmek ... Tek bir özyinelemeli neden (hala bir sebep göremiyorum grepMultiple daha hızlı olmayacağım grepgelen ın vadede findhavai ama ben ayrıştırma işlemi oluşturma ve desen nedeniyle bunu yedeklemek için belirli sayılara sahip değildir).
Perry

3

Grep'i daha da hızlandırmak isterseniz, çalıştırmadan önce kabuğunuzdaki yerel ayarı ayarlayabilirsiniz, yani "LC_ALL = c" kullanın. Bu, grep'e devralınır ve gerekli olmadığında Unicode işlemeyi devre dışı bırakır ve bazı durumlarda grep'i önemli ölçüde hızlandırabilir. Bunu belgeleyen harika bir blog http://www.inmotionhosting.com/support/website/ssh/speed-up-grep-searches-with-lc-all adresinde bulunabilir . Bu hile de sadece grep değil, bash kabuk komut dosyalarını da hızlandırabilir.

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.