Saya ingin menemukan perintah bash yang akan membiarkan saya grep setiap file dalam direktori dan menulis output grep itu ke file terpisah. Dugaan saya adalah melakukan sesuatu seperti ini
ls -1 | xargs -I{} "grep ABC '{}' > '{}'.out"
tapi, sejauh yang saya tahu, xargs tidak suka tanda kutip ganda. Namun, jika saya menghapus tanda kutip ganda, maka perintah tersebut akan mengalihkan output dari seluruh perintah ke satu file yang disebut '{}'. Keluar alih-alih ke serangkaian file individual.
Adakah yang tahu cara melakukan ini menggunakan xargs? Saya hanya menggunakan skenario grep ini sebagai contoh untuk menggambarkan masalah saya dengan xargs sehingga solusi apa pun yang tidak menggunakan xargs tidak berlaku untuk saya.
xargs
tanpa-0
: ini hanya berlaku ketika Anda memfind
- pipe output denganxargs
, kan? ketika saya melakukanxargs -a <input_file>
bagaimana saya akan menggunakan ini? Sebagian besar perintah menyukaigrep
keluaran dengan\n
dan bukan\0.
Satu-satunya cara saya dapat memikirkan untuk mengatasi ini adalah dengan menggunakantr
lagi untuk memperbaikinya mungkin. Tetapi mengapa penting untuk menggunakannya hanya dengan-0
?-0
,xargs
akan mengambil nama file Anda dan memecah semua spasi, tanda kutip dan garis miring terbalik di dalamnya. Anda harus melupakanxargs
sebagai alat. Jika Anda memiliki garis, gunakan bash loop untuk mengulangi gariswhile read line; do <command> "$REPLY"; done < file-with-lines
command | while ...
xargs
GNU),xargs
perlu dihindari kecuali seseorang dapat menggunakannya-0
. Terima kasih.xargs
, yang tidak selalu melibatkan penguraianls
atau penggunaansh -c
. Ini tidak menjawab pertanyaan sedikit pun, tetapi merupakan hasil google pertama untuk pertanyaan itu, hanya menambah kebingungan.xargs -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}
? Terutama, aturan tanda kutip (dobel) dan simbol "-" di akhir. Terima kasihSolusi tanpa
xargs
adalah sebagai berikut:... dan hal yang sama dapat dilakukan dengan
xargs
, ternyata:Sunting : kutipan tunggal ditambahkan setelah komentar oleh lhunath .
sumber
Saya menganggap contoh Anda hanyalah contoh dan bahwa Anda mungkin perlu> untuk hal-hal lain. GNU Parallel http://www.gnu.org/software/parallel/ dapat menjadi bantuan Anda. Tidak perlu mengutip tambahan selama nama file Anda tidak mengandung \ n:
Jika Anda memiliki nama file dengan \ n di dalamnya:
Sebagai bonus tambahan Anda menjalankan pekerjaan secara paralel.
Tonton video intro untuk mempelajari lebih lanjut: http://pi.dk/1
Instalasi 10 detik akan mencoba melakukan instalasi penuh; jika itu gagal, instalasi pribadi; jika gagal, instalasi minimal:
Jika Anda perlu memindahkannya ke server, yang tidak menginstal GNU Parallel, coba
parallel --embed
.sumber