Saya berhasil menembak diri sendiri di tempat yang menyakitkan (sangat buruk) dengan memformat ulang sebuah partisi yang menyimpan data berharga. Tentu saja itu tidak disengaja, tetapi itu terjadi.
Namun, saya berhasil menggunakan testdisk
dan photorec
memulihkan sebagian besar data. Jadi sekarang saya memiliki semua data yang didistribusikan lebih dari hampir 25.000 direktori. Sebagian besar file adalah file .txt, sedangkan sisanya adalah file gambar. Ada lebih dari 300 file .txt di setiap direktori.
Saya bisa grep
atau gunakan find
untuk mengekstraksi string tertentu dari file .txt dan mengeluarkannya ke file. Misalnya, inilah baris yang saya gunakan untuk memverifikasi bahwa data saya ada di file yang dipulihkan:
find ./recup*/ -name '*.txt' -print | xargs grep -i "searchPattern"
Saya dapat menampilkan "searchPattern" ke file, tetapi itu hanya memberi saya pola itu. Inilah yang ingin saya capai:
Telusuri semua file dan cari string tertentu. Jika string itu ditemukan dalam file, cat SEMUA konten file itu ke file output. Jika pola ditemukan di lebih dari satu file, tambahkan konten file berikutnya ke file output. Perhatikan bahwa saya tidak ingin menampilkan pola yang saya cari, tetapi SEMUA isi file di mana pola ditemukan.
Saya pikir ini bisa dilakukan, tetapi saya tidak tahu bagaimana cara mengambil semua isi file setelah mengambil pola tertentu darinya.
sumber
Jawaban:
Jika saya memahami tujuan Anda dengan benar, yang berikut ini akan melakukan apa yang Anda inginkan:
Ini akan mencari semua
*.txt
file di./recup*/
, menguji masing-masingsearchPattern
, jika cocok itu akancat
file. Output dari semuacat
file ed akan diarahkan keoutputfile.txt
.Ulangi untuk setiap pola dan file keluaran.
Jika Anda memiliki banyak direktori yang cocok
./recup*
, Anda mungkin berakhir dengan aargument list too long error
. Cara sederhana untuk melakukannya adalah melakukan sesuatu seperti ini sebagai gantinya:Ini akan cocok dengan path lengkap. Jadi
./recup01234/foo/bar.txt
akan dicocokkan. Itu-mindepth 2
agar tidak cocok./recup.txt
, atau./recup0.txt
.sumber
grep -l
), lalu|sort|uniq
dancat
dari daftar file.Daripada mengeluarkan pola Anda, output nama file menggunakan "-l" pada grep, dan kemudian gunakan itu sebagai input ke cat.
atau
Saya menduga Anda dapat mengisi rincian lainnya. BTW, jika Anda mungkin memiliki spasi atau karakter aneh lainnya dalam nama file (tidak mungkin dalam kasus khusus ini, tetapi untuk tujuan di masa mendatang), gunakan -print0 pada find dan -Z pada grep, dikombinasikan dengan opsi -0 pada xargs untuk digunakan null byte antara nama file dan bukan baris baru.
sumber
\+
daripada\;
menghindari masalah itu, tapi saya tidak tahu cara kerjanya dengan sepasang argumen -exec (saya curiga "buruk"). Menggunakan sepasang xargs, Anda hanya akan memiliki beberapa proses baru yang muncul, yang seharusnya lebih cepat dengan banyak file.>afile
atau|acommand
atau apa pun yang sesuai untuk situasi Anda. :)sudo find /* -name pg_hba.conf | xargs sudo cat
sudo xargs
daripadaxargs sudo
. Ketika Anda menjalankanxargs sudo
, itu membangun baris perintah dengan asumsi perintah itusudo cat args
. Tapi kucing di / bin, jadi sudo berjalan/bin/cat args
. Jika perintah Anda berada di direktori yang lebih panjang, seperti / usr / local / bin, maka perintah sudo yang benar-benar berjalan dapat mengakibatkan baris perintah terlalu panjang dan kesalahan yang sulit dilacak. Selain itu,sudo xargs
hanya log yang Anda jalankan xargs, sementaraxargs sudo
log perintah dengan semua argumen - menghasilkan beberapa baris sudo log yang panjang. :)Ini bukan kode yang optimal, tetapi sangat mudah dan akan bekerja dengan baik jika efisiensi tidak menjadi masalah. Masalahnya adalah bahwa ia akan menerobos file berkali-kali, bahkan jika string sudah ditemukan di dalamnya.
Pertama, cari string Anda dan tulis file yang cocok ke daftar.
Ulangi langkah ini menggantikan yang
searchPattern
diperlukan. Ini menghasilkan daftar file yang cocok di/tmp/file_list
.Masalahnya adalah bahwa file ini mungkin memiliki duplikat di dalamnya. Karenanya, kita dapat mengganti duplikat dengan
|sort|uniq
. Bagian inisort
menempatkan duplikat yang berdekatan satu sama lain, sehinggauniq
dapat menghapusnya. Kemudian Anda dapatcat
menggunakan file-file ini bersama-samaxargs
(dengan setiap nama file dipisahkan oleh baris baru\n
). Karenanya,Tidak seperti jawaban lain, ini memiliki dua langkah di dalamnya, dan file sementara, jadi saya benar-benar hanya merekomendasikannya jika Anda memiliki beberapa pola untuk ditemukan.
sumber
Tergantung pada shell dan lingkungan Anda, Anda dapat melakukannya seperti ini (dalam bash)
Jika Anda ingin memisahkan hasil berdasarkan pola, Anda dapat memodifikasinya menjadi seperti
sumber
while
Loop kemudian membaca bahwa daftar dan melakukangrep
/ kondisionalcat
bagian.#!/bin/bash
, membuatnya bisa dieksekusichmod +x recoverData.sh
, dan mengeksekusinya menggunakan./recoverData.sh
. Jangan tidak menggunakansh recoverData.sh
karena/bin/sh
kemungkinan sebuahdash
shell .