web-dev-qa-db-fra.com

Trouver un fichier identique avec un nom différent

Est-il possible de trouver un sans connaître son nom?

J'ai créé un fichier avec LaTex, puis je l'ai copié dans un autre répertoire local et renommé le fichier PDF. Je ne sais plus où se trouve le fichier d'origine, mais j'ai le fichier renommé sous la main. Je voudrais apporter quelques modifications à mon fichier latex et recréer le pdf.

Puisque je sais que le fichier d'origine est exactement le même que celui renommé, à l'exception du nom, y a-t-il un moyen de retrouver mon fichier d'origine?

8
dmx

Lorsque la seule différence est le nom, les fichiers de cabine doivent avoir le même contenu et la même taille.

1. À propos du contenu. Nous pouvons comparer deux fichiers à l’aide de la commande diff file-1 file-2. Nous pouvons également utiliser cette commande pour un test de cette manière:

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

2. À propos de la taille. Nous pouvons trouver un fichier d’une certaine taille à l’aide de la commande (où 12672 est la taille du fichier en octets):

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

Ou nous pouvons utiliser une plage de cette manière (où 12600-12700 est la plage de taille de fichier en octets):

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

Notez que, par défaut, la commande find fonctionne de manière récursive.

3. Combinez les deux méthodes (où file-1 est notre fichier de modèle):

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

4. Exemple. Supposons que nous ayons la structure de répertoires suivante:

$ 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

Le résultat de la commande ci-dessus sera:

$ find /tmp/test -type f -size -12700c -size +12600c -printf '%p\t' -exec sh -c 'diff -q file-1 "$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 nous pouvons simplifier la sortie en modifiant notre commande de la manière suivante:

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

Mise à jour à partir des commentaires. La commande suivante recherche un fichier de même taille que le file-1, puis les virgules diff est impliqué dans les options --brief et --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

Nous pouvons comparer md5sum des fichiers de cette façon:

  • Obtenez le md5sum du fichier de signatures:

    $ md5sum file-1
    d18b61a77779d69e095be5942f6be7a7  file-1
    
  • Utilisez-le avec notre commande:

    $ find /path -type f -not -name "file-1" -size $(stat -c%s file-1)c -exec sh -c 'echo "d18b61a77779d69e095be5942f6be7a7 $1" | md5sum -c -' sh {} \;
    /tmp/test/file-3: OK
    
5
pa4080
  • Vous pouvez rechercher une chaîne particulière avec grep -rl "string" (-r pour récursif, trouver la chaîne dans les fichiers, -l pour afficher le nom du fichier, pas la chaîne)
3
Simon Van Machin

Cela peut prendre un certain temps, mais cela devrait être efficace et fiable. Cela suppose que vous utilisez Bash. Remplacez file par le nom de votre fichier renommé:

shopt -s globstar
for i in **; do [ -f "$i" ] && cmp --silent file "$i" && echo "$i"; done
  • shopt -s globstar active la suppression récursive avec **. Vous pouvez le désactiver avec shopt -u globstar, mais il est désactivé par défaut et le sera lorsque vous ouvrirez un nouveau shell.
  • for i in ** boucle sur tous les fichiers en dessous de celui-ci. Exécutez la commande à partir du répertoire de niveau le plus élevé pouvant contenir le fichier ou le répertoire avec le fichier ou le répertoire ... (appliquez la récursivité à cette phrase!)
  • [ -f "$i" ] && si le fichier est un fichier standard existant, alors ...
  • cmp --silent file "$i" && s'il n'y a pas de différence entre file et le fichier en cours d'examen (c.-à-d. si cmp se ferme correctement), alors ...
  • echo $i affiche le chemin relatif du fichier (cela imprime également le chemin de file lui-même, mais je ne voyais pas grand avantage à résoudre ce problème).

Merci à cette réponse sur Stack Overflow pour la méthode cmp de comparaison de fichiers.

3
Zanna

Si vous recherchez (ou êtes d'accord avec) une application graphique, vous pouvez essayer l'application " FSlint Janitor ". Vous pouvez l'installer en lançant

Sudo apt-get install fslint

Comment utiliser l'application:

Une fois installé, suivez les étapes ci-dessous.

  1. Lancer l'application.
  2. Sélectionnez l'option "Doublons" (1) pour rechercher des fichiers ayant le même contenu .
  3. Cliquez sur le bouton "+ Ajouter" (2) et sélectionnez les répertoires dans lesquels rechercher les fichiers (assurez-vous que l'option "recurse" est cochée pour inclure les sous-répertoires).
  4. Cliquez sur le bouton "Rechercher" (3) et attendez.

enter image description here

3
pomsky

Grep peut le trouver rapidement

Lorsqu'elle est utilisée correctement, la commande grep peut trouver le doublon rapidement. Veillez à ne pas effectuer de recherche dans tout le système de fichiers, sinon vous aurez besoin de jours pour terminer. J'ai récemment documenté ceci ici: `grep`ing tous les fichiers d'une chaîne prend beaucoup de temps

Pour une vitesse optimale, utilisez:

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

Si votre fichier se trouve peut-être dans un répertoire Windows, supprimez le répertoire mnt.

Si vous savez que le fichier se trouve quelque part dans le répertoire /home, vous pouvez raccourcir la commande:

grep -rnw '/home' -e 'String in file'
2
WinEunuuchs2Unix