Recherche de fichiers par noms

11

Comment puis-je apporter tous les fichiers avec des noms conformes à une expression rationnelle spécifique, récursivement dans une arborescence de répertoires, dans un seul tampon dirigé?

Je peux donc les renommer / supprimer tous en même temps?

iLemming
la source
2
Avez-vous déjà pensé à "find-name-dired"? (Utilise des caractères génériques, pas des expressions rationnelles.)
Marco Wahl
2
Vous devez soumettre cela comme une réponse @MarcoWahl. Je n'avais aucune idée que Dired pouvait faire ça!
Tyler
1
La bibliothèque find-dired+.elvous offre une version améliorée de la commande find-name-dired. Il accepte des arguments optionnels qui spécifient (1) les profondeurs de recherche min et max et (2) les chemins à exclure de la recherche.
Drew

Réponses:

11

Caractère générique

Utilisation

M-x find-name-dired

pour obtenir des fichiers selon un caractère générique.

Exemple

Trouvez tous les fichiers avec le suffixe "org" dans le répertoire "~ / org /". Entrez les informations suivantes

M-x find-name-dired
~/org
*org

et apprécie.

Expression régulière

Utilisation

M-x find-dired

avec des arguments appropriés pour obtenir des fichiers selon une expression régulière.

Exemple

Trouvez tous les fichiers avec le suffixe "org" dans le répertoire "~ / org /". Entrez les informations suivantes

M-x find-dired
~/org
-regex ".*org$"

et apprécie.

Marco Wahl
la source
Est-il possible d'automatiser ce processus où vérifier automatiquement *orgsans l'entrer manuellement
alper
Si je vous comprends bien, il existe de nombreuses possibilités. Par exemple, faites une recherche spéciale avec une commande avec (defun my-find-orgfiles () (interactif) (find-name-dired "~ / myorgs /" "* org")) et placez-la dans votre fichier init. Utilisez ensuite Mx my-find-orgfiles RET. Ou même liez la commande à une clé.
Marco Wahl
Peut my-find-orgfiles ()suivi par "t" et "Q" // qui sélectionne tout et applique? @Marco Wahl
alper
2

Expression régulière

Pour utiliser une expression régulière, vous pouvez également essayer find-lisp-find-dired. Cette commande appartient à la bibliothèque standard. find-lisp , qui est entièrement écrit en elisp, c'est-à-dire que vous n'avez pas besoin d'avoir installé un findprogramme externe .

Par exemple, ce qui suit montre tous les fichiers avec l'extension '.el' dans le répertoire ~ / lisp:

M-x find-lisp-find-dired RET ~/lisp RET \.el\' RET

(Le match honore case-fold-search).

Caractère générique

Il convient de noter que depuis la prochaine version d'Emacs (v26.1), Dired prend en charge les wilcards dans la partie répertoire de l'argument du nom de fichier. Cela signifie les travaux suivants:

C-x d ~/soft/*/*.c RET

(La correspondance est sensible à la casse).

Cette commande affiche dans un tampon Dired tous les fichiers avec l'extension '.c', 2 niveaux de profondeur sous '~ / soft' . Cela signifie que tous les fichiers comme «~ / soft / foo / bar.c» seront répertoriés, mais pas les fichiers comme «~ / soft / qux.c» ni «~ / soft / foo / baz / qux.c» .

Le même mais insensible à la casse:

C-x d ~/soft/*/*.[cC] RET

Prime

Si vous exécutez Dired avec un 'ls' implémenté dans elisp, 'ls-lisp' ou 'eshell-ls', vous pouvez alors lister récursivement tous les fichiers correspondant à un caractère générique avec la syntaxe suivante:

C-x d ~/soft/**/*.c RET

Noter la '**'. Dans ce cas, tous les fichiers sous «~ / soft» correspondant au caractère générique sont affichés, même «~ / soft / qux.c» .

Cependant, lorsque vous utilisez insert-directory-program l'extension, le caractère générique est effectué par le shell système; cela signifie que cette syntaxe récursive '**' ne fonctionne que si elle est prise en charge par votre shell. Par exemple, zsh le supporte, mais bash ne le fait pas. Avec les shells autres que zsh, la commande précédente fera la même chose que:

C-x d ~/soft/*/*.c RET
Tino
la source