Perintah Grep untuk menemukan file yang berisi string teks dan memindahkannya


15

Saya dapat menemukan file di folder yang berisi string teks tertentu menggunakan perintah ini:

grep -lir 'string' ~/directory/*

Bagaimana cara memindahkan file yang muncul di hasil di atas ke lokasi lain?


Ini dia. grep -i -Z -r -l 'string' . | xargs -I{} mv {} ./folder_name
Alan Dong

Jawaban:


10

Seperti biasa, waspadalah grep -r. -rbukan opsi standar, dan dalam beberapa implementasi seperti semua tetapi versi GNU yang sangat baru grep, ia mengikuti tautan simbolik ketika menuruni pohon direktori, yang umumnya bukan yang Anda inginkan dan dapat memiliki implikasi parah jika misalnya ada symlink ke "/ "Di suatu tempat di pohon direktori.

Dalam filosofi Unix, Anda menggunakan perintah untuk mencari direktori untuk file, dan yang lain untuk melihat isinya.

Menggunakan alat GNU, saya akan lakukan:

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

Tetapi meskipun demikian, waspadalah terhadap kondisi ras dan kemungkinan masalah keamanan jika Anda menjalankannya sebagai satu pengguna pada direktori yang dapat ditulisi oleh beberapa pengguna lain.


ini memberi saya kesalahan menemukan: `grep 'diakhiri oleh sinyal 13. ada ide apa yang salah?
Reena Parekh

@ReenaParekh, itu akan menjadi SIGPIPE. Itu hanya akan terjadi jika xargskeluar sebelum membaca hingga akhir file arg-nya yang seharusnya tidak terjadi kecuali xargs terbunuh dengan sendirinya atau gagal karena alasan apa pun dalam hal ini saya berharap Anda melihat kesalahan tentang itu juga.
Stéphane Chazelas

15

Gunakan xargsdalam konser dengan mvsintaks ketiga:mv [OPTION]... -t DIRECTORY SOURCE...

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

Hati-hati dengan file yang berisi karakter khusus (spasi, tanda kutip). Jika ini kasus Anda, memfilter daftar dengan sed(menambahkan tanda kutip di sekitar nama file dengan s/^/'/;s/$/'/) mungkin membantu, tetapi Anda harus yakin, tanda kutip ini tidak akan muncul dalam nama file. GNU grepmemiliki opsi -Z/ --nulluntuk mengakhiri nama file NUL.

Alternatif untuk sintaks ketiga mvadalah menggunakan xargsdengan string placeholder ( -I).

Opsi lain adalah substitusi perintah - $( )atau backticks ``(dalam bash) seperti yang disebutkan dalam jawaban ire_and_curses '.


3
gnu grep mendukung flag -Z untuk memisahkan nama file dengan karakter byte nol, yang bila digunakan bersamaan dengan flag -0 ke xargs, dapat mengatasi masalah karakter khusus yang Anda sebutkan
iruvar

@ChandraRavoori terima kasih, saya telah memperbarui jawabannya.
peterph


1

Hanya menggunakan fitur yang ditentukan POSIX, dan tidak membuat asumsi tentang nama file:

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

Catatan:

Anda mengatakan "string" bukan "pola," sehingga opsi -F(pencarian string tetap) greptampaknya sesuai.

Jika direktori tujuan Anda ada di mana saja di dalam direktori pencarian Anda, Anda mungkin memiliki beberapa kondisi lomba yang tidak menyenangkan.

Spesifikasi POSIX untuk grep

Spesifikasi POSIX untuk find


Ini mungkin solusi terbaik untuk Macos / BSD
Ali

0

Menggunakan paralel GNU :

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

ht / @ lin-dong untuk jawaban aslinya dengan xargs.


Akan lebih baik jika Anda akan dikreditkan jawaban @ lindong di komentar dari lebih dari setahun yang lalu.
roaima

0

-Asumsikan bahwa Anda memiliki direktori tujuan sebagai 'eksternal' dan perlu memindahkan semua file XLS, Anda dapat mencoba perintah di bawah ini

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.