Comment puis-je listr les noms de files / directorys dans un directory récursivement identiques mais avec des majuscules / cas différents? ex.:
INPUT (pas la command ls
, les directorys):
[user@localhost ~/a] ls -R .: b ./b: ize Ize ./b/ize: ./b/Ize: [user@localhost ~/a]
SORTIE:
/b/ize
Si vous avez GNU uniq
, vous pouvez sortinger la casse ( -i
) et utiliser -d
pour n'imprimer que des lignes en double:
find . | sort -f | uniq -di
Comme @StephaneChazelas l'a mentionné dans sa réponse , cela peut ne pas faire ce que vous attendez si vous pouvez avoir des paths dupliqués qui ne diffèrent que dans le cas (comme a/b/foo
et A/b/foo
).
En supposant que les noms de file ne contiennent pas de caractères de nouvelle ligne, vous pouvez faire quelque chose comme:
find . | tr '[:upper:]' '[:lower:]' | sort | uniq -d
Notez que certaines implémentations de tr
comme GNU tr
ne changent pas le cas des caractères multi-octets.
Notez également que le path qu'il rapporte peut ne pas être le path d'access d'un file. Par exemple, s'il y a un ./a/b/fOo
et un file ./A/b/fOo
, il signale ./a/b/foo
. Si ce n'est pas ce que vous voulez, vous voudrez peut-être affiner vos exigences.
Toutes ces idées sont mauvaises. Utilisez des sums de contrôle et assurez-vous que les files sont identiques. Alors la tâche devient facile.
find . -type f -exec md5sum {} + | sort | perl -a -nE'push(@{$db{$F[0]}},$F[1]);END{for(keys%db){say"Dupe detected @{@db{$_}}"if scalar@{$db{$_}}>1}}'
Cela permettra de sha1sum chaque file dans le directory et tous les sous-directorys et de sortir tous les dupes de ce file, s'il y en a. J'ai fait le pipeline multiligne pour la lisibilité.