Extraindo dados de backup de duplicidade

1

Eu fiz alguns backups dos meus sistemas anteriores usando Deja Dup (duplicidade). Na minha distribuição atual, não está disponível, então eu simplesmente extraí os dados. Agora, a fim de tornar os dados significativos novamente, tenho que catar os arquivos assim:

cat ? ?? > file

Pontos de interrogação são confiáveis a partir do número de arquivos, é claro.

A estrutura dos dados extraídos é assim:

some/long/path/to/file/[original_filename_converted_to_folder.extension]/

, então o nome do arquivo é uma pasta e dentro dessa pasta existem arquivos numerados (como 1, 2..20..300..etc). Arquivos diferentes (que agora são pastas) têm números diferentes dos arquivos numerados dentro deles.

Então eu pensei em pegar todos os diretórios onde. é presente. Então, se não houver subdiretórios nesse diretório, coloque todos os arquivos em um, forneça o nome dessa pasta (porque é o nome real do arquivo), transfira um diretório para cima (..) e exclua esse diretório (aquele usado para criar um diretório). arquivo com nome de arquivo)

Então comecei a escrever script, mas tenho alguns problemas com isso:

directories = "$(find . -type d)"
for i in "$directories"
do
  fdir = "$i"
  rdir = "$(dirname "$i")";
  fname = "$(basename "$i")";
  if [[ "$(basename "$i")" == *"."* ]] then
    cd "$i"
    FILECOUNT="$(find . -type f -maxdepth 1 -printf x | wc -c)"
    DIRCOUNT="$(find . -type d -maxdepth 1 -printf x | wc -c)"
    DIRCOUNT=$(( DIRCOUNT - 1 ))
    if DIRCOUNT == 0 then
      if FILECOUNT != 0 then
        # >> this is the problematic part
        DIGITS = "$(grep -o "[s|S]" <<<"$x" | wc -l)"
          cat "$QUESTIONMARKS" > "$fname"
          mv "$fname" "$rdir" +"/"+ "$fname"+".restored"
          rm *
          cd ..
          rmdir fname
          mv "$fname"+".restored" "$fname"
        # << end of problems
      fi
    fi
  fi
done

Então, o problema é - como eu gero pontos de interrogação dependendo do número do arquivo no diretório? se houver um número de arquivo de 1 dígito no diretório, o comando deverá ficar assim:

cat ? > file

se houver um número de arquivo de 2 dígitos no diretório, então:

cat ? ?? > file

se 3, então:

cat ? ?? ??? > file

Você tem a ideia ...

Depois disso, eu escrevi uma lista de comandos que devem prosseguir, embora - eu simplesmente os adicione assim ou eu tenha que envolvê-los em ()?

Está tudo bem gravar em tal script? Não vou entrar em alguns problemas?

Alguma outra solução possível para alcançar isso?

Obrigado.

    
por Ežiukas Stebintis Pasaulį 24.04.2015 / 15:39

1 resposta

0

Se eu entendi corretamente, você tem diretórios que contém arquivos chamados 1 , 2 , 3 , etc. (até um limite de variável) e você deseja substituir cada diretório por um arquivo que tenha o mesmo nome como o diretório, e é a concatenação dos arquivos em ordem numérica.

Nesta resposta, vou usar zsh , porque é muito mais fácil de usar do que uma combinação de bash e outros Ferramentas. Você pode traduzir o método para sh e find (o bash e o GNU find serão mais fáceis do que o sh simples e o POSIX find).

Primeiro, para localizar os diretórios, a presença de um ponto não parece ser uma heurística muito útil: você perderá arquivos cujo nome não contenha um ponto e você atingirá diretórios cujo nome contém um ponto . Procurar por diretórios que contenham arquivos nomeados numericamente parece mais confiável (embora não seja perfeito, nada é). Aviso: código não testado:

#!/bin/zsh
for dir in **/1(:h); do
  files=($dir/*(Nn:t))
  for ((i=1; i<=$#files; i++)); do
    # if the ith file isn't called i, skip this directory
    if [[ $files[i] != $i ]]; then files=; break; fi
  done
  if [[ -z $files ]]; then continue; fi
  # The directory contains only numbered files, and they're in sequence.
  # Concatenate the files, move the result into place and remove the directory.
  tmp=$(TMPDIR=$dir:h mktemp -d)
  mv -- $dir $tmp &&
  for x in $tmp/$dir:t/$^files; do cat -- $x; done >$tmp/file &&
  mv -- $tmp/file $dir &&
  rm -r $tmp
done

Explicação dos recursos do zsh:

  • :t e :h são modificadores de expansão do histórico para obter a parte do diretório e o nome de base do um arquivo respectivamente.
  • *(Nn) usa qualificadores de glob : n para classificar nomes de arquivos em ordem numérica de ordem lexicográfica e N para obter uma matriz vazia em vez de um erro se o diretório estiver vazio.
  • O ^ parâmetro modificador de expansão em $dir/$^files adiciona o prefixo $dir/ para cada elemento da matriz files (em oposição a adicioná-lo apenas ao primeiro elemento).
por 25.04.2015 / 16:10