Encontre um arquivo idêntico com um nome diferente [duplicado]

7

É possível encontrar um sem saber seu nome?

Eu criei um arquivo com o LaTex, depois copiei para outro diretório local e renomeiei o pdf. Não sei mais onde o arquivo original está localizado, mas tenho o arquivo renomeado disponível. Eu gostaria de fazer algumas modificações no meu arquivo de látex e recriar o pdf.

Como eu sei que o arquivo original é exatamente o mesmo que o renomeado, exceto pelo nome, existe alguma maneira de encontrar meu arquivo original?

    
por dmx 28.02.2018 / 11:20

5 respostas

5

Quando a única diferença é que os arquivos de booth de nome devem ter o mesmo conteúdo e tamanho.

1. Sobre o conteúdo. Podemos comparar dois arquivos pelo comando diff file-1 file-2 . Também podemos usar este comando para um teste desta forma:

diff -q file-1 file-2 > /dev/null && echo 'equal' || echo 'different'

2. Sobre o tamanho. Podemos encontrar um arquivo com determinado tamanho pelo comando (onde 12672 é o tamanho do arquivo em bytes):

find /path/to/search -type f -size 12672c -printf '%p\n'

Ou podemos usar um intervalo dessa forma (onde 12600-12700 é o intervalo de tamanho de arquivo em bytes):

find /path/to/search -type f -size -12700c -size +12600c -printf '%p\n'

Note que, por padrão, o comando find funciona recursivamente.

3. Combine os dois métodos (onde file-1 é o nosso arquivo padrão):

find /path/to/search -type f -size -12700c -size +12600c -printf '%p\t' -exec sh -c 'diff -q file-1 "" > /dev/null && echo "equal" || echo "different"' sh {} \;

4. Exemplo. Vamos supor que temos a seguinte estrutura de diretórios:

$ tree /tmp/test
/tmp/test
├── file-1   # this is the pattern file
├── file-2   # this is almost the same file but wit few additional characters
└── file-3   # this is exact copy of file-1

O resultado do comando acima será:

$ find /tmp/test -type f -size -12700c -size +12600c -printf '%p\t' -exec sh -c 'diff -q file-1 "" > /dev/null && echo "equal" || echo "different"' sh {} \; 
/tmp/test/file-2        different  # OK: here we have added few additional characters
/tmp/test/file-3        equal      # OK: this is exact copy of file-1
/tmp/test/file-1        equal      # OK: this is file-1 compared to its self

Ou podemos simplificar a saída alterando nosso comando desta maneira:

$ find /tmp/test -type f -not -name "file-1" -size -12700c -size +12600c \
  -exec sh -c 'diff -q file-1 "" > /dev/null && printf "%s\tis equal\n" ""' sh {} \;
/tmp/test/file-3        is equal

Atualizar a partir dos comentários. O comando a seguir encontra um arquivo com o mesmo tamanho que o file-1 e, em seguida, o diff está envolvido nas opções --brief e --report-identical-files :

find /path -type f -not -name "file-1" -size $(stat -c%s file-1)c -exec diff -qs file-1 {} \;
Files file-1 and /tmp/test/file-3 are identical

Nós podemos compare md5sum dos arquivos desta forma:

  • Obtenha o md5sum do arquivo padrão:

    $ md5sum file-1
    d18b61a77779d69e095be5942f6be7a7  file-1
    
  • Use-o com nosso comando:

    $ find /path -type f -not -name "file-1" -size $(stat -c%s file-1)c -exec sh -c 'echo "d18b61a77779d69e095be5942f6be7a7 " | md5sum -c -' sh {} \;
    /tmp/test/file-3: OK
    
por pa4080 28.02.2018 / 12:20
3
  • Você pode pesquisar por uma string específica com grep -rl "string" (-r para recursiva, encontrando a string em arquivos, -l para mostrar o nome do arquivo, não a string)
por Simon Van Machin 28.02.2018 / 11:35
3

Se você está procurando (ou bem) uma aplicação GUI, você pode tentar o aplicativo " FSlint Janitor ". Você pode instalá-lo executando

sudo apt-get install fslint

Como usar o aplicativo:

Depois de instalado, siga as etapas abaixo.

  1. Inicie o aplicativo.
  2. Selecione a opção "Duplicatas" (1) para pesquisar arquivos com o mesmo conteúdo .
  3. Clique no botão "+ Adicionar" (2) e selecione os diretórios para procurar arquivos (verifique se a opção "recurse" está marcada para incluir subdiretórios).
  4. Clique no botão "Encontrar" (3) e aguarde.

    
por pomsky 28.02.2018 / 12:18
2

Isso pode demorar um pouco, mas deve ser eficaz e confiável. Ele assume que você está usando o Bash. Substitua file pelo nome do seu arquivo renomeado:

shopt -s globstar
for i in **; do [ -f "$i" ] && cmp --silent file "$i" && echo "$i"; done
  • shopt -s globstar ativa a globalização recursiva com ** . Você pode desativá-lo com shopt -u globstar , mas ele fica desativado por padrão e ficará desativado quando você abrir um novo shell.
  • for i in ** executa todos os arquivos abaixo deste. Execute o comando no diretório de nível mais alto que pode conter o arquivo ou o diretório com o arquivo ou o diretório ... (aplique recursão a esta sentença!)
  • [ -f "$i" ] && se o arquivo é um arquivo regular que existe então ...
  • cmp --silent file "$i" && se não houver diferença entre file e o arquivo que está sendo examinado (ou seja, se cmp sair com sucesso), então ...
  • echo $i imprime o caminho relativo do arquivo (isso também imprime o caminho de file em si, mas não vejo muito benefício em consertar isso).

Graças a esta resposta no Stack Overflow para o método cmp de comparação de arquivos.

    
por Zanna 28.02.2018 / 11:58
1

Grep pode encontrá-lo rapidamente

Quando usado corretamente, o comando grep pode encontrar a duplicata rapidamente. Você deve ter cuidado para não pesquisar todo o sistema de arquivos ou levará dias para ser concluído. Eu recentemente documentou isso aqui: 'grep'ing todos os arquivos para um string demora muito tempo

Para uso de velocidade ideal:

grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e 'String in file'

Se o seu arquivo puder estar em um diretório do Windows, remova o diretório mnt .

Se você sabe que o arquivo está dentro do diretório /home , você pode encurtar o comando:

grep -rnw '/home' -e 'String in file'
    
por WinEunuuchs2Unix 28.02.2018 / 12:18