Consegui me fotografar onde dói (muito ruim) reformatando uma partição que continha dados valiosos. Claro que não foi intencional, mas aconteceu.
No entanto, eu consegui usar testdisk
e photorec
recuperar a maioria dos dados. Então agora eu tenho todos esses dados distribuídos em quase 25.000 diretórios. A maioria dos arquivos são arquivos .txt, enquanto os demais são arquivos de imagem. Existem mais de 300 arquivos .txt em cada diretório.
Eu posso grep
ou uso find
para extrair determinadas seqüências de caracteres dos arquivos .txt e enviá-las para um arquivo. Por exemplo, aqui está uma linha que eu usei para verificar se meus dados estão nos arquivos recuperados:
find ./recup*/ -name '*.txt' -print | xargs grep -i "searchPattern"
Eu posso gerar "searchPattern" para um arquivo, mas isso me dá esse padrão. Aqui está o que eu realmente gostaria de realizar:
Percorra todos os arquivos e procure por uma sequência específica. Se essa sequência for encontrada em um arquivo, coloque TODO o conteúdo desse arquivo em um arquivo de saída. Se o padrão for encontrado em mais de um arquivo, anexe o conteúdo dos arquivos subseqüentes ao arquivo de saída. Observe que eu simplesmente não quero exibir o padrão que estou procurando, mas TODO o conteúdo do arquivo no qual os padrões são encontrados.
Eu acho que isso é possível, mas simplesmente não sei como capturar todo o conteúdo de um arquivo depois de receber um padrão específico dele.
fonte
Respostas:
Se entendi seu objetivo corretamente, o seguinte fará o que você deseja:
Isso procurará todos os
*.txt
arquivos./recup*/
, testará cada umsearchPattern
, se correspondercat
ao arquivo. A saída de todos oscat
arquivos ed será direcionada paraoutputfile.txt
.Repita para cada arquivo de padrão e saída.
Se você tiver um número muito grande de diretórios correspondentes
./recup*
, poderá acabar com aargument list too long error
. A maneira mais simples de contornar isso é fazer algo assim:Isso corresponderá ao caminho completo. Então
./recup01234/foo/bar.txt
será correspondido. O-mindepth 2
é para que não corresponda./recup.txt
, ou./recup0.txt
.fonte
grep -l
), em seguida,|sort|uniq
ecat
da lista de arquivos.Em vez de emitir seu padrão, imprima o nome do arquivo usando "-l" no grep e use-o como entrada para cat.
ou
Eu suspeito que você pode preencher os detalhes restantes. BTW, se você tiver espaços ou outros caracteres estranhos nos nomes dos arquivos (improvável neste caso específico, mas para propósitos futuros), use -print0 na localização e -Z no grep, combinada com a opção -0 no xargs para usar bytes nulos entre nomes de arquivos em vez de novas linhas.
fonte
\+
vez de\;
evitar esse problema, mas não sei como isso funciona com um par de -exec args (suspeito "mal"). Usando um par de xargs, você terá apenas alguns processos novos, o que deve ser mais rápido com muitos arquivos.>afile
ou|acommand
ou o que for apropriado para sua situação. :)sudo find /* -name pg_hba.conf | xargs sudo cat
sudo xargs
vez dexargs sudo
. Quando você executaxargs sudo
, ele cria a linha de comando, assumindo que o comando ésudo cat args
. Mas o gato está em / bin, então o sudo é executado/bin/cat args
. Se o seu comando estiver em um diretório mais longo, como / usr / local / bin, o comando sudo realmente será executado pode resultar em uma linha de comando muito longa e em um erro difícil de rastrear. Além disso,sudo xargs
apenas registre o que você executou xargs, enquantoxargs sudo
registra o comando com todos os argumentos - resultando em algumas longas linhas de log do sudo. :)Este não é o código ideal, mas é muito simples e funcionará bem se a eficiência não for um problema. O problema é que ele percorre os arquivos várias vezes, mesmo que a string já tenha sido encontrada neles.
Em primeiro lugar, procure suas strings e escreva os arquivos correspondentes em uma lista.
Repita esta etapa substituindo
searchPattern
conforme necessário. Isso produz uma lista de arquivos correspondentes em/tmp/file_list
.O problema é que esse arquivo pode ter duplicatas. Portanto, podemos substituir as duplicatas por
|sort|uniq
. Asort
peça coloca as duplicatas adjacentes uma à outra, para queuniq
possam ser removidas. Em seguida, você podecat
esses arquivos juntos usandoxargs
(com cada nome de arquivo separado por nova linha\n
). Conseqüentemente,Ao contrário das outras respostas, ele possui duas etapas e um arquivo temporário; portanto, eu recomendaria apenas se você tiver vários padrões a serem encontrados.
fonte
Dependendo do seu shell e ambiente, você pode fazer algo assim (no bash)
Se você quiser separar os resultados de acordo com o padrão, poderá modificá-lo para algo como
fonte
while
loop então lê essa lista e faz a partegrep
/ condicionalcat
.#!/bin/bash
,chmod +x recoverData.sh
executá-los e executá-los usando./recoverData.sh
. Você não usarsh recoverData.sh
uma vez/bin/sh
é provável que umdash
shell .