Saya memiliki koleksi file (* .zip, * .txt, * .tar.gz, * .doc, ... dll). File-file ini berada dalam jalur. Saya ingin menemukan semua file (* .txt), lalu salin, hanya, file teks yang berisi kata-kata tertentu (misalnya LINUX / UNIX).
Saya menjalankan yang berikut:
find . -name "*.txt" | grep 'LINUX/UNIX'
Perintah ini dapat menemukan semua file teks, kemudian "grep" memfilter file teks yang dihasilkan dengan mendaftar hanya file teks yang berisi 'LINUX / UNIX'.
Bagaimana saya bisa menyalin file terakhir ini (yaitu file teks yang berisi 'LINUX / UNIX') ke jalur pilihan tertentu?
Saya mencoba melamar xargs
find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>
Tapi itu tidak berhasil
Jawaban:
Mencoba:
Karena perintah ini menggunakan pemisahan-NUL, aman untuk semua nama file termasuk yang memiliki nama sulit yang termasuk kosong, tab, atau bahkan baris baru.
Di atas membutuhkan GNU
cp
. Untuk MacOS / FreeBSD, coba:Bagaimana itu bekerja:
grep
opsi dan argumen-r
memberitahu grep untuk mencari secara rekursif melalui struktur direktori. (Pada FreeBSD,-r
akan mengikuti symlink ke direktori. Ini tidak berlaku untuk OS / X atau versi terbaru GNUgrep
.)--include '*.txt'
memberitahu grep untuk hanya mengembalikan file yang namanya cocok dengan bola dunia*.txt
(termasuk yang tersembunyi seperti.foo.txt
atau.txt
).-l
memberitahu grep untuk hanya mengembalikan nama file yang cocok, bukan pertandingan itu sendiri.--null
memberitahu grep untuk menggunakan karakter NUL untuk memisahkan nama file. (--null
didukung oleh digrep
bawah GNU / Linux , MacOS dan FreeBSD tetapi tidak OpenBSD .)LINUX/UNIX
memberitahu grep untuk mencari hanya file yang isinya termasuk regexLINUX/UNIX
.
cari di direktori saat ini. Anda dapat menghilangkannya di versi terbaru GNUgrep
, tetapi kemudian Anda harus melewati--
terminator opsicp
untuk menjaga dari nama file yang dimulai dengan-
.xargs
opsi dan argumen-0
memberitahu xargs untuk mengharapkan input yang dipisahkan oleh NUL.-r
memberitahu xargs untuk tidak menjalankan perintah kecuali jika setidaknya satu file ditemukan. (Opsi ini tidak diperlukan pada BSD atau OSX dan tidak kompatibel dengan OSXxargs
.)cp -t /path/to/dest
menyalin direktori ke direktori target. (-t
membutuhkan GNUcp
.)sumber
cp -t
hanya Linux.--null
dan menambahkan versi untuk BSD / OSX yang tidak digunakancp -t
.grep
tidak punya--null
.--null
.Lebih mudah dibawa (hanya fitur POSIX):
sumber
Sh / Bash one liner berikut adalah metode lain, meskipun hanya akan berfungsi di direktori saat ini, dan tidak berulang:
The
-l
pilihan untuk grep akan mencetak daftar file yang sedang disalin, meskipun Anda bisa menggunakan-q
jika Anda tidak ingin melihat apa-apa di layar.sumber
Saya tidak yakin mengapa string asli tidak berfungsi. Perintah berikut bekerja untuk saya.
find / -name (nama file *) | grep '(filename.extention)' | xargs cp -t ./
Dalam kasus saya nama file * adalah kumpulan file dengan nama yang sama dengan jenis file yang berbeda (txt, zip, dll). Saya memang grep hanya mengetahui namafile.txt dan menyalinnya ke direktori tujuan saya (yang saat ini, ./).
sumber