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?
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?
Jawaban:
Seperti biasa, waspadalah grep -r
. -r
bukan 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.
xargs
keluar 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.
Gunakan xargs
dalam konser dengan mv
sintaks 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 grep
memiliki opsi -Z
/ --null
untuk mengakhiri nama file NUL.
Alternatif untuk sintaks ketiga mv
adalah menggunakan xargs
dengan string placeholder ( -I
).
Opsi lain adalah substitusi perintah - $( )
atau backticks ``
(dalam bash) seperti yang disebutkan dalam jawaban ire_and_curses '.
Jika nama file Anda tidak mengandung karakter khusus (spasi atau putih \[*?
), gunakan subtitusi perintah :
mv `grep -lir 'string' ~/directory/*` destination/
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) grep
tampaknya sesuai.
Jika direktori tujuan Anda ada di mana saja di dalam direktori pencarian Anda, Anda mungkin memiliki beberapa kondisi lomba yang tidak menyenangkan.
Menggunakan paralel GNU :
grep -i -Z -r -l 'string' . | parallel 'mv {} destination/{}'
ht / @ lin-dong untuk jawaban aslinya dengan xargs.
-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 /
grep -i -Z -r -l 'string' . | xargs -I{} mv {} ./folder_name