Comment trouver des noms de fichiers doublons (de manière récursive) dans un répertoire donné? BASH
J'ai besoin de trouver tous les noms de fichiers doublons dans un dir arbre. Je ne sais pas, ce que dir de l'arborescence de l'utilisateur donnera un argument de script, donc je ne sais pas la hiérarchie des répertoires. J'ai essayé ceci:
#!/bin/sh
find -type f | while IFS= read vo
do
echo `basename "$vo"`
done
mais c'est pas vraiment ce que je veux. Il ne trouve qu'un seul doublon, puis se termine, même si il y a plus de noms de fichiers doublons, aussi il ne marche pas l'impression d'un chemin complet (imprime uniquement un nom de fichier) et en double comptage. Je voulais faire quelque chose de similaire à cette commande:
find DIRNAME | tr '[A-Z]' '[a-z]' | sort | uniq -c | grep -v " 1 "
mais il doenst travail pour moi, je ne sais pas pourquoi. Même si j'ai des doublons, il imprime rien.
J'utilise Xubuntu 12.04.
OriginalL'auteur yak | 2013-04-29
Vous devez vous connecter pour publier un commentaire.
Ici est une autre solution de (basé sur la suggestion de @jim-mcnamara) sans awk:
Solution 1
Cependant, vous devez faire la même recherche à deux reprises. Cela peut devenir très lent si vous avez à la recherche de beaucoup de données. Enregistrement de la "trouver" des résultats dans un fichier temporaire, peut donner un meilleur rendement.
Solution 2 (avec fichier temporaire)
Puisque vous ne voulez pas vous écrire un fichier temporaire sur le disque dur, dans certains cas, vous pouvez choisir la méthode qui s'adapte à vos besoins.
Les deux exemples d'imprimer le chemin d'accès complet du fichier.
Bonus de question ici: Est-il possible d'enregistrer la totalité de la sortie de la commande rechercher une liste à une variable?
Petite erreur dans la Solution 1 peut conduire à des faux positifs. Vous feriez mieux d'écrire la dernière recherche: trouver $dirname -type f | grep "^${fileName}$"
Comment pourrais-je changer la solution 2, de sorte que le premier fichier trouvé n'est pas ajouté au fichier temporaire, uniquement les doublons sont trouvés seconde?
MacOs : trouver: -printf: inconnu primaire ou de l'exploitant
OriginalL'auteur psibar
awk
? Merci quand même 🙂Vous pouvez le faire avec n'importe quel langage qui prend en charge les tableaux associatifs (ou le hachage est un autre nom) - perl est un exemple. bash 4 support pour les tableaux associatifs.
Donc, vous dites que seul le bash solution n'est pas possible? Je veux dire, sans sed, awk, perl, python, etc. juste pur bash?
par ailleurs, cette solution ne vous raconte pas le nom du fichier sans le chemin d'accès où ils sont. Je pensais que c'était une exigence
ops, merci, vous avez raison. J'ai besoin d'un chemin d'accès complet. La Question est de nouveau ouvert.
OriginalL'auteur jim mcnamara
Oui c'est une très vieille question.
Mais toutes ces boucles et les fichiers temporaires semblent un peu lourd.
Voici mon 1 ligne de réponse:
Il a ses limites en raison de
uniq
etsort
:uniq
etsort
)uniq
ne supporte pas la comparaison 1 champ et est inflexible avec délimiteurs de champ)Mais il est assez souple en ce qui concerne sa sortie grâce à
find -printf
et fonctionne bien pour moi. Aussi semble être ce que @yak essayé de parvenir à l'origine.Illustrant certaines des options que vous avez avec cette:
Aussi il y a des options dans
sort
etuniq
pour ignorer la casse (comme le sujet de l'ouvreur destiné à atteindre par la tuyauterie à traverstr
). Rechercher à l'aide deman uniq
ouman sort
./usr/share/fslint/fslint/findsn /path/to/files
, Mais j'aime votre one-liner mieux pour sa souplesse.OriginalL'auteur trs
Et il fonctionne aussi avec les espaces dans les noms de fichiers. Voici un test simple (le premier argument est le répertoire):
OriginalL'auteur Elisiano Petrini
Une commande "find" seulement:
OriginalL'auteur Fabien Bouleau
Cette solution a écrit un fichier temporaire dans un répertoire temporaire pour chaque nom de fichier unique trouvés. Dans le fichier temporaire, j'écris le chemin où j'ai d'abord trouvé le nom de fichier unique, afin que je puisse de sortie plus tard. Donc, j'ai créer beaucoup plus de fichiers que d'autres posté des solutions. Mais, c'était quelque chose que je pouvais comprendre.
Voici le script, nommé
fndupe
.Qui suit est un exemple d'utilisation du script.
Suivant est un exemple de sortie lorsque le script trouve les noms de fichiers en double.
Testé avec Bash version:
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
OriginalL'auteur Mike Finch
Voici ma contribution (ce juste des recherches pour un type de fichier spécifique, les fichiers pdf sont dans ce cas) mais il le fait de manière récursive:
OriginalL'auteur Benjamin Frazier