J'essaie de trouver tous les fichiers qui ont le même nom de fichier (à l'exception de l'extension de fichier) qui apparaissent 3 fois. J'ai aussi besoin du chemin complet du fichier.
Ce que j'ai actuellement est
#get file without extension
alias lse="ls -1R | sed -e 's/\.[a-zA-Z]*$//'"
#print out the current dir and get files occuring 3 times
lse | sed "s;^;`pwd`/;" | sort | uniq -c | grep " 3 "
Cela fonctionne cependant pwd
imprime le dossier dans lequel j'ai exécuté la commande et non le chemin d'accès au fichier.
Alors j'ai essayé find
find . -type f | sed "s#^.#$(pwd)#" | sort | uniq -c
Cela fonctionne mais inclut l'extension de fichier. Quand j'essaye d'ajouter sed -e 's/\.[a-zA-Z]*$//'"
Je reçois des erreurs car je ne suis pas sûr de savoir comment combiner les deux commandes sed et je ne peux pas sembler mettre une seconde fois à sed
donc ce que j'essaie de faire est
find . -type f | sed "s#^.#$(pwd)#" | sed -e 's/\.[a-zA-Z]*$//'"| sort | uniq -c | grep " 3 "
mais cela ne fonctionne pas.
grep " 3 "
peut causer des problèmes avec des fichiers comme `3 .text` (espace avant et après 3). Vous pouvez le remplacer parawk '{if ($1 == 3) {print}}'
(mais vérifiez quel est le séparateur par défaut awk pour votre système)Autre façon mais similaire en utilisant d'autres concepts:
Les usages:
find
de-printf
pour effacer directement les principaux annuaires.[:alpha:]
classe de caractères pour définir les lettres. Ceci émule votre exemple, mais ne prend pas en compte les fins de fichier avec des nombres (par exemple,.mp3
). Changer en[:alnum:]
faire correspondre les lettres et les chiffres. Recherchez plus d'informations sur les classes de personnages pour voir d'autres possibilités.awk
pour imprimer uniquement les lignes du nombre 3 (facilement remplaçables parcount>=3
ce qui semble plus logique). Puisqueprint
est l'action par défaut, ceci peut être accompli en utilisant seulementawk '$1==3'
.la source