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
. -r
standart 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.
xargs
arg 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 xargs
ile uyum içinde mv
bireyin üçü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
/ --null
seçeneğine sahiptir .
Üçüncü sözdizimine alternatif mv
kullanıyor xargs
tutucu 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 grep
uygun 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