Cela n'a pas été spécifié, mais voici une solution sans expressions régulières si quelqu'un est intéressé.
Nous pouvons utiliser find . -type f
pour obtenir simplement des fichiers, puis utiliser dirname
et basename
écrire le conditionnel. Les utilitaires ont le comportement suivant:
$ find . -type f
./dir2/spam/spam.pdf
./dir2/dir2.tex
./dir3/dir3.pdf
./dir3/eggs/eggs.pdf
./dir1/dir1.pdf
./dir1/dir1.txt
basename
renvoie juste le nom de fichier après le dernier /
:
$ for file in $(find . -type f); do basename $file; done
spam.pdf
dir2.tex
dir3.pdf
eggs.pdf
dir1.pdf
dir1.txt
dirname
donne le chemin complet jusqu'à la finale /
:
$ for file in $(find . -type f); do dirname $file; done
./dir2/spam
./dir2
./dir3
./dir3/eggs
./dir1
./dir1
Par conséquent, basename $(dirname $file)
donne le répertoire parent du fichier.
$ for file in $(find . -type f); do basename $(dirname $file) ; done
spam
dir2
dir3
eggs
dir1
dir1
Solution
Combinez ce qui précède pour former le conditionnel "$(basename $file)" = "$(basename $(dirname $file))".pdf
, puis n'imprimez chaque résultat find
que si ce conditionnel renvoie true.
$ while read file; do if [ "$(basename "$file")" = "$(basename "$(dirname "$file")")".pdf ]; then echo $file; fi done < <(find . -type f)
./dir2/spam/spam.pdf
./dir3/dir3.pdf
./dir3/eggs/eggs.pdf
./dir1/dir1.pdf
./Final Thesis/grits/grits.pdf
./Final Thesis/Final Thesis.pdf
Dans l'exemple ci-dessus, nous avons ajouté un répertoire / fichier avec des espaces dans le nom pour traiter ce cas (merci à @Kusalananda dans les commentaires)