dado um arquivo, encontre onde dentro de um subdiretório ele foi copiado para

0

Dado um arquivo que eu sei que foi copiado em um determinado diretório, eu quero encontrar o caminho exato onde a cópia do arquivo agora reside. É garantido que o arquivo não foi editado e será exatamente como a cópia.

Não seria necessário verificar o diretório inteiro e todos os seus subdiretórios, pois sei algumas coisas sobre onde o arquivo pode estar. Os arquivos têm duas características: EXECUTAR e VERSÃO, que são conhecidas por nós e restringir onde a cópia do arquivo pode ser.

A solução provavelmente usaria diff para comparar arquivos e grep ou find para selecionar os diretórios que eu realmente quero ver. Eu não tenho ideia, no entanto, de como montar isso.

Portanto, temos um arquivo ( MYFILE=data.txt ) e queremos saber o caminho de sua cópia (por exemplo, Jun-09/15/version3/run1 ) e já sabemos, por exemplo, alguns diretórios que podem ser evitados. Por exemplo, para um determinado arquivo, podemos saber que RUN=run1 , caso em que não devemos olhar para os diretórios "run2". Da mesma forma, podemos saber VERSION=version3 , caso em que não devemos olhar para os diretórios version1 ou version2. Vale a pena notar que há também a possibilidade de o arquivo não ter uma cópia, e nesse caso eu gostaria de saber isso também.

Explicação de como é a estrutura do arquivo: O diretório em questão tem uma pasta para cada mês nos últimos sete anos (chamada, por exemplo, "Jun-09"), e cada um deles esses subdiretórios têm uma pasta para cada dia (por exemplo, "11" para o 11º dia do mês). Em seguida, cada uma dessas pastas "dia" tem uma pasta para cada "versão" (os dados em questão tem 3 "versões") e cada um deles tem duas "execuções". No entanto, apesar do fato de que as pastas devem organizar os arquivos no tempo, não há garantia de que o arquivo foi criado ou editado pela última vez naquele mês.

MY ATTEMPT : Eu tentei, a partir do diretório raiz da estrutura descrita acima, executar find . -type f -name data.txt | diff ~/myOtherdirectory/files/data.txt , mas continuo recebendo 'operando ausente após' ~ / myOtherdirectory / files / data.txt '. O ideal seria encontrar as diferenças entre o arquivo que estou vendo e todos os outros arquivos que ele poderia ser. Ele não restringe os diretórios a serem observados e não obtém o caminho da cópia.

    
por farid99 10.07.2015 / 21:04

4 respostas

1

Eu sugiro que você - dependa de seu então - fslint, duff, fdupes, dmerge, rmlint, rdfind - que ambos são capazes de encontrar gêmeos muito mais rápido que fdupes ou dupseek.

Eu executaria:

$ find /path -type f -printf "%p - %s\n" | sort -nr -k3 | uniq -D -f1
    
por 11.07.2015 / 21:18
1
myfile=/full/path/to/data.txt

mysearchpath=/my/search/path/root/directory

for file in $(find ${mysearchpath} -type f)
do
  diff ${myfile} ${file} > /dev/null 
  result=${?}
  if [ $result -eq 0 ]
  then
    echo "Identical file found at ${file}"
  fi
done

Embora esta seja uma maneira muito cara (computar recursos sábios, especialmente se você estiver compartilhando este servidor com outras pessoas fazendo outras coisas) ao fazê-lo. Você pode criar uma soma de verificação desses arquivos e, talvez, executar um trabalho para criar uma soma de verificação dos arquivos adicionados em um determinado dia e colocá-los em um arquivo simples em algum lugar. Quando você precisar localizar arquivos, crie uma soma de verificação desse arquivo e compare-o com o banco de dados de soma de verificação. Apenas um pouco de comida para pensar.

    
por 10.07.2015 / 22:43
1

Se isso é algo que precisa ser verificado regularmente, você pode configurar um cron job para criar um resumo dos hashes md5 dos arquivos, algo como

echo > $digest_file; find $search_path -type f | xargs md5sum >> $digest_file

Supondo que isso tenha sido executado desde que seu arquivo foi copiado, encontre primeiro o hash do seu arquivo conhecido e, em seguida, verifique a lista em busca de outros arquivos com o mesmo hash. O desempenho dependerá, obviamente, do número e do tamanho dos arquivos em seu caminho de pesquisa.

Isso tem o benefício adicional de que, se você copiar o resumo antes de cada execução e comparar os antigos e os novos resumos, poderá detectar corrupção / alteração de dados.

    
por 10.07.2015 / 23:05
1

Com find e cmp :

find . -type f -exec sh -c 'cmp -s data.txt "$0" 2>/dev/null && echo $0' {} \;

Você pode adicionar mais alguns critérios para limitar a pesquisa.

    
por 11.07.2015 / 19:43