Rechercher et masquer une extension de fichier


1

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.

Réponses:


2

qu'est-ce qu'il y a de plus dans la seconde commande sed?

 /tmp/test $ touch foo.bar foo.baz foo.foo
 /tmp/test $ find . -type f | sed "s#^.#$(pwd)#" | sed -e 's/\.[a-zA-Z]*$//'| sort | uniq -c | grep " 3 "
 3 /tmp/test/foo

merci, je ne peux pas croire que je n'ai pas remarqué cela
Daveo

1
Notez que grep " 3 " peut causer des problèmes avec des fichiers comme `3 .text` (espace avant et après 3). Vous pouvez le remplacer par awk '{if ($1 == 3) {print}}' (mais vérifiez quel est le séparateur par défaut awk pour votre système)
lupincho

1

Autre façon mais similaire en utilisant d'autres concepts:

find . -type f -printf '%f\n' | sed 's/\.[[:alpha:]]*$//' |\
sort | uniq -c | awk '$1==3'

Les usages:

  • find de -printf pour effacer directement les principaux annuaires.
  • la [: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 par count>=3 ce qui semble plus logique). Puisque print est l'action par défaut, ceci peut être accompli en utilisant seulement awk '$1==3'.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.