Saya memiliki koleksi file ( *.zip, *.txt, *.tar.gz, *.doc, …etc). File-file ini berada dalam jalur. Saya ingin mencari semua file ( *.txt), lalu salin, hanya file teks yang berisi kata-kata tertentu (misalnya LINUX/UNIX).
Saya menjalankan yang berikut ini:
find . -name "*.txt" | grep 'LINUX/UNIX'
Perintah ini dapat menemukan semua file teks, kemudian "grep" memfilter file teks yang dihasilkan dengan hanya mencantumkan file teks yang berisi 'LINUX/UNIX'.
Bagaimana cara menyalin file akhir ini (yaitu file teks yang berisi 'LINUX/UNIX') ke jalur pilihan tertentu?
Saya mencoba menerapkan xargs
find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>
Tapi tidak berhasil
Jawaban yang Diterima:
Coba:
grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0r cp -t /path/to/dest
Karena perintah ini menggunakan pemisahan NUL, maka aman untuk semua nama file termasuk yang dengan nama sulit yang menyertakan kosong, tab, atau bahkan baris baru.
Di atas membutuhkan GNU cp
. Untuk MacOS/FreeBSD, coba:
grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0 sh -c 'cp "[email protected]" /path/to/dest' sh
Cara kerjanya:
-
grep
opsi dan argumen-
-r
memberitahu grep untuk mencari secara rekursif melalui struktur direktori. (Di FreeBSD,-r
akan mengikuti symlink ke direktori. Ini tidak berlaku untuk OS/X atau versi terbaru dari GNUgrep
.) -
--include '*.txt'
memberitahu grep untuk hanya mengembalikan file yang namanya cocok dengan glob*.txt
(termasuk yang tersembunyi seperti.foo.txt
atau.txt
). -
-l
memberi tahu grep untuk hanya mengembalikan nama file yang cocok, bukan yang cocok itu sendiri. -
--null
memberitahu grep untuk menggunakan karakter NUL untuk memisahkan nama file. (--null
didukung olehgrep
di bawah GNU/Linux, MacOS dan FreeBSD tapi tidak OpenBSD.) -
LINUX/UNIX
memberitahu grep untuk hanya mencari file yang isinya menyertakan regexLINUX/UNIX
-
.
cari di direktori saat ini. Anda dapat menghilangkannya di versi terbaru GNUgrep
, tetapi kemudian Anda harus memberikan--
opsi terminator kecp
untuk menjaga dari nama file yang dimulai dengan-
.
-
-
xargs
opsi dan argumen-
-0
memberi tahu xargs untuk mengharapkan input yang dipisahkan NUL. -
-r
memberitahu xargs untuk tidak menjalankan perintah kecuali setidaknya satu file ditemukan. (Opsi ini tidak diperlukan pada BSD atau OSX dan tidak kompatibel denganxargs
OSX .) -
cp -t /path/to/dest
menyalin direktori ke direktori target. (-t
membutuhkan GNUcp
.)
-