Metin dizesi içeren dosyaları bulmak ve bunları taşımak için Grep komutu


15

Bu komutu kullanarak belirli bir metin dizesi içeren bir klasördeki dosyaları bulmak mümkün:

grep -lir 'string' ~/directory/*

Yukarıdaki sonuçta görünen dosyaları başka bir konuma nasıl taşırım?


İşte burada. grep -i -Z -r -l 'string' . | xargs -I{} mv {} ./folder_name
Alan Dong

Yanıtlar:


10

Her zaman olduğu gibi, sakının grep -r. -rstandart bir seçenek değildir ve GNU'nun son sürümleri dışındaki tüm uygulamalarda olduğu gibi bazı uygulamalarda grep, dizin ağacını indirirken sembolik bağlantılar izler; bu genellikle istediğiniz bir şey değildir ve örneğin "/ "dizin ağacının bir yerinde.

Unix felsefesinde, dosyalarda dizin aramak için bir komut ve içeriğine bakmak için başka bir komut kullanırsınız.

GNU araçlarını kullanarak şunları yaparım:

xargs -r0 --arg-file <(find . -type f -exec grep -lZi string {} +
  ) mv -i --target-directory /dest/dir

Ancak o zaman bile, başka bir kullanıcı tarafından yazılabilir bir dizinde bir kullanıcı olarak çalıştırırsanız, yarış koşullarına ve olası güvenlik sorunlarına dikkat edin.


bu bana hata bulma verir: sinyal 13 tarafından sonlandırılan `` grep '' herhangi bir fikir ne yanlış gidiyor?
Reena Parekh

@ReenaParekh, bu bir SIGPIPE olurdu. Bu sadece xargsarg dosyasının sonuna okumadan çıkarsa , xargs kendisini öldürmediyse veya herhangi bir nedenle başarısız olmadıkça, bu durumda da bir hata görmenizi beklememeliydim.
Stéphane Chazelas

15

Kullanım xargsile uyum içinde mvbireyin üçüncü sözdizimi:mv [OPTION]... -t DIRECTORY SOURCE...

grep -lir 'string' ~/directory/* | xargs mv -t DEST

Özel karakterler (boşluklar, tırnak işaretleri) içeren dosyalara dikkat edin. Durum buysa, listeyi sed( ile dosya adlarına tırnak işaretleri eklemek) ile filtrelemek s/^/'/;s/$/'/yardımcı olabilir, ancak bu tırnakların dosya adlarında görünmeyeceğinden emin olmanız gerekir. GNU grep, dosya adlarını NUL sonlandırmak için -Z/ --nullseçeneğine sahiptir .

Üçüncü sözdizimine alternatif mvkullanıyor xargstutucu dizge ile ( -I).

Başka bir seçenek de ire_and_curses yanıtında belirtildiği gibi komut ikamesi - $( )veya geri basmalardır ``(bash olarak).


3
gnu grep, dosya adlarını sıfır bayt karakteriyle ayırmak için bir -Z bayrağını destekler; bu, -0 bayrağını xargs ile birlikte kullanıldığında, bahsettiğiniz özel karakterler sorununu
çözebilir

@ChandraRavoori teşekkürler, cevabı güncelledim.
peterph

7

Dosya adlarınız herhangi bir özel karakter (boşluk veya \[*?) içermiyorsa , komut yerine kullanın :

mv `grep -lir 'string' ~/directory/*` destination/

Geri tepmeler kullanımdan kaldırıldı; bunun yerine daha taşınabilir, okunabilir ve istiflenebilir $ (...) kullanın.
kullanıcı bilinmiyor

2

Yalnızca POSIX tarafından belirtilen özellikleri kullanma ve dosya adları hakkında hiçbir varsayımda bulunma :

find ~/directory -type f -exec grep -qiF 'string' {} \; -exec mv {} /path/to/dest \;

Notlar:

"Desen" değil "dize" dediniz, böylece -F(sabit dize arama) seçeneği grepuygun görünüyor.

Hedef dizininiz arama dizininizin herhangi bir yerindeyse, hoş olmayan bazı yarış koşullarınız olabilir.

POSIX teknik özellikleri grep

POSIX teknik özellikleri find


Bu Macos / BSD
Ali

0

Kullanılması GNU paralel :

grep -i -Z -r -l 'string' . | parallel 'mv {} destination/{}'

xargs ile yaptığı orijinal cevap için ht / @ lin-dong.


Bir yıl önce gelen yorumlarda @ lindong'un cevabına güvenirseniz iyi olur.
roaima

0

Hedef dizininizin 'harici' olduğunu ve tüm XLS dosyalarını taşımanız gerektiğini varsayalım, aşağıdaki komutu deneyebilirsiniz

sudo mv find /var/log/ -type f -name "*.xls"/ harici /

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.