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?
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?
Yanıtlar:
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.
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.
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).
Dosya adlarınız herhangi bir özel karakter (boşluk veya \[*?) içermiyorsa , komut yerine kullanın :
mv `grep -lir 'string' ~/directory/*` destination/
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.
Kullanılması GNU paralel :
grep -i -Z -r -l 'string' . | parallel 'mv {} destination/{}'
xargs ile yaptığı orijinal cevap için ht / @ lin-dong.
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 /
grep -i -Z -r -l 'string' . | xargs -I{} mv {} ./folder_name