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?
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
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)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.
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
Une fois installé, suivez les étapes ci-dessous.
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'