2014-07-08 5 views
0

Je me demandais au cas où je pourrais faire ce qui suit, mieux que ce que j'ai. Objectif: Identifier les fichiers portant le même nom dans l'arborescence de répertoires. Je n'ai aucune connaissance s'il y aurait un fichier en double ou l'emplacement/nom de tels fichiers.trouver des fichiers avec les mêmes noms dans le répertoire

Sortie attendue: Répertorie les fichiers avec l'emplacement.

Entrée fournie: chemin du répertoire principal pour la recherche.

Mon algorithme:

1.list tous les fichiers dans le répertoire cible (je l'ai utilisé find -name "")

2.List1: trier les noms de fichiers

3.List2 : fichiers Uniquify noms

listes de 4.Diff de l'étape 2 & 3 pour obtenir le fichier répété

5.extract l'emplacement.

Sample Directory: 
temp/ 
|-- d1 
| |-- d2 
| | `-- f3 
| |-- d3 
| | `-- f3 
| |-- f1 
| `-- f2 
`-- d4 
    |-- d5 
    | |-- f2 
    | `-- f6 
    |-- f4 
    `-- f5 


> find temp/ -type f -follow -print | sed 's;.*/;;' | sort -u > ~/tmp/12 
> find temp/ -type f -follow -print | sed 's;.*/;;' | sort -n > ~/tmp/11 

> diff ~/tmp/11 ~/tmp/12 
3,4d2 
< f2 
< f3 

> find temp/ -name f2 
temp/d1/f2 
temp/d4/d5/f2 

> find temp/ -name f3 
temp/d1/d2/f3 
temp/d1/d3/f3 

Je veux simplifier ce processus. Toute aide serait appréciée. S'il vous plaît laissez-moi savoir au cas où vous avez besoin de plus de détails.

+0

Vous pouvez ajouter 'uniq -d' après (ou à la place de) votre tri qui peut vous aider à ne faire correspondre que des doublons. Vous pouvez également regarder la commande linux 'tree' pour la sortie formatée que vous montrez. Là vous pouvez être capable d'exécuter 'tree' sur' dir1' 'dir2' en écrivant la sortie en ** tmp ** et ensuite utiliser grep pour localiser les doublons. Juste une pensée pour une approche différente. Ce que vous avez ne ressemble pas à un mauvais départ. –

+0

Je cherche une méthode où je pourrais éviter les fichiers tmp si possible, car le répertoire cible peut ne pas avoir d'autorisation en écriture. – user1495523

Répondre

0

Guys c'est une solution que j'ai identifiée en fonction de mes besoins et peut vous aider: Vos commentaires sont les bienvenus.

set idirectory = `echo $* | awk '{print $1}'` 
if (-d $idirectory) then 
    foreach xxx (`find $idirectory -type f -follow -print | sed 's;.*/;;' | sort -n | uniq -d`) 
     echo "Multiple files found for " $xxx 
     find $idirectory -name $xxx 
    end 
endif 
Questions connexes