Comment rechercher tous les fichiers commençant par "ABC" dans un répertoire?


58

Je dois rechercher des fichiers commençant par un nom particulier. Il peut y avoir plusieurs fichiers commençant par un motif particulier et je veux lister tous les fichiers présents dans le répertoire.

Réponses:


60

Pour compléter les réponses existantes:

ls

L'utilitaire de liste de répertoires par défaut lspeut être utilisé en combinaison avec les caractères génériques du shell. Pour rechercher tous les fichiers avec un motif abc:

ls abc*   # list all files starting with abc---
ls *abc*  # list all files containing --abc--
ls *abc   # list all files ending with --abc

Notez que l'extension de fichier est également pertinente pour les résultats de la recherche.


tree

Dans le cas où nous aurions besoin de répertorier les fichiers dans une arborescence de répertoires, nous pouvons également demander treeà rechercher un modèle donné tel que:

tree -P 'abc*'  # list directory tree of file starting with abc---
tree -l 'def*'  # exclude files starting with def---

Dans ce cas, treelui - même prend en charge les caractères génériques.


2
Pourquoi, quand je le fais ls -l B*, affiche - t-il le contenu de tous les répertoires commençant par Bau lieu de simplement les noms des répertoires correspondants?
ErikE

@ErikE Parce que quand vous demandez lsde lister un répertoire, il l'ouvre, c'est la même chose que faire ls -l BirthdayPhotos. Vous pouvez supprimer ce comportement avec ls -d B*.
Azor Ahai

@AzorAhai Mais pourquoi traite-t-il B*comme une spécification de répertoire?
ErikE

@ErikE Parce que l'utilisation du fichier glob se B*développe pour correspondre à tous les répertoires commençant par, de Bsorte que vous passez réellement lsune liste de répertoires, de sorte qu'elle les ouvre tous pour vous.
Azor Ahai

2
Ne répond pas à la question. ls -d ABC*était ce que l'auteur demandait. De plus, les commentaires dans l'extrait de code sont erronés, ls abc*répertorie le contenu des répertoires commençant par abc.
greatvovan

42

Vous pouvez utiliser la findcommande pour rechercher des fichiers avec un motif

find . -type f -name "abc*" 

La commande ci-dessus va rechercher le fichier qui commence par abc dans le répertoire de travail en cours.

-name 'abc'listera les fichiers qui correspondent exactement. Par exemple: abc

Vous pouvez aussi utiliser

 -iname
 -regex 

option avec findcommande pour rechercher le nom de fichier en utilisant un motif


7

Il y a plusieurs façons de le faire, en fonction de ce que vous voulez en faire. Généralement, si vous voulez juste les lister, vous pouvez le faire dans un terminal en utilisant:

find | grep '^\./ABC'

... et en remplaçant ABCpar votre texte.

Pour comprendre la commande, décomposons-la un peu:

  • findrépertorie tous les fichiers du répertoire en cours et de ses sous-répertoires; l'utiliser seul listera simplement tout ce qu'il y a là. Notez que findchaque fichier ou répertoire commence par un ./, indiquant que son chemin est relatif au répertoire actuel. En être conscient est important car cela signifie que nous rechercherons des résultats en commençant par ./ABCet non pas simplement ABC.

  • Le caractère de canal |redirige la sortie d'une commande vers une autre, dans ce cas, la sortie de findest redirigée grep. Ceci s'appelle la tuyauterie.

  • grepprend la sortie et les filtres à l'aide du motif donné, ^\./ABC.

    • Notez que le modèle est cité avec des guillemets simples ' 'pour empêcher le shell d'interpréter les caractères spéciaux qu'il contient.
  • Maintenant, le motif lui-même est écrit dans une syntaxe particulière appelée expression régulière , ou regex en abrégé. Regex est un outil de recherche extrêmement puissant si vous le maîtrisez. Il existe des sites tels que celui-ci qui vous en apprennent plus sur le sujet, mais notez que ce grepn'est pas un moteur de regex à part entière et que vous ne pouvez pas tout faire avec.

  • Pour notre but:

    • ^dans regex correspond au début de la chaîne; cela l'empêche de faire correspondre le modèle s'il ne se produit pas au début du nom de fichier.

    • .dans regex a aussi une signification spéciale: cela signifie "faites correspondre n'importe quel caractère ici". Si vous souhaitez l'utiliser comme un point littéral, vous devrez "l'échapper" en utilisant une barre oblique inverse \avant celle-ci. (Ouais, faire correspondre n'importe quel personnage serait sans danger dans notre cas, mais je l'ai fait par souci de complétude.)


1
Pourquoi voudriez-vous find | grepquand finda ses propres capacités de correspondance de motif parfaitement bonnes?
Darael

3

vous pouvez utiliser GREP, je pense que c'est la solution la plus simple, probablement aussi ajouter d'autres paramètres de grep pour rendre la correspondance plus précise

tree | grep ABC

2

Vous pouvez rechercher un modèle particulier à l'aide du gestionnaire de fichiers Nautilus et d'expressions régulières.

Pour ce faire, cliquez sur Sélectionner les éléments correspondants dans le menu Matériel comme ci-dessous (vous pouvez également appuyer sur Ctrl+ s).

entrez la description de l'image ici

Ensuite, tapez simplement l' expression régulière ABC* et validez.

entrez la description de l'image ici

Chaque fichier dont le nom correspond à votre modèle sera automatiquement sélectionné.

entrez la description de l'image ici

J'utilise Nautilus 3.6. * À partir de GNOME3 PPA sur Ubuntu 12.10 (Quantal).


1

La solution la plus facile pour moi

ls | grep PATTERN

Ici, vous pouvez donner n'importe quelle expression régulière dans le motif.

Par exemple, pour rechercher des fichiers avec "ab" n’importe où dans son nom, tapez

ls | grep ".*ab.*"

Pour trouver les fichiers commençant par "ab", tapez

ls | grep "^ab"

1

Si vous ne connaissez pas le répertoire dans ABC*lequel se trouvent les fichiers et que vous avez des millions de fichiers, la locatecommande est la méthode la plus rapide.

$ locate /ABC
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABC6AD2FEC16465049B48D39FD2FE538258F2A34
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABCBFDA54262F47253F95ED6ED4131A465EE0E39
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
/mnt/old/home/rick/.cache/mozilla/firefox/3vkvi6ov.default/cache2/entries/ABC0C99FCEABAD0C6AA2078CD025A1CDE48D7BA1
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh

Remarques:

  • La commande ci-dessus prend 1 seconde pour s'exécuter sur 1 million de fichiers.
  • En comparaison, la findcommande commençant au /répertoire racine durera très longtemps et générera de nombreuses erreurs d'autorisation.
  • Si des fichiers ont été créés aujourd'hui, vous devez d' sudo updatedbabord les exécuter .

0

j'utilise

ls | grep abc

ou

ls -la | grep abc

Il montre tous les fichiers avec abc, pas seulement en commençant par abc. Mais, c'est un moyen très facile pour moi de faire cela.


0

Python:

$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'

Perl:

$ perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name  },".")' 

0
printf "%s" /path/to/files/ABC*

Ceci est une correspondance de motif glob qui est ancrée aux deux extrémités. Cela correspond à toutes les occurrences de fichiers commençant par "ABC", telles que "ABC", "ABC.txt", "ABC123", mais pas "xABC". À partir de la ligne de commande utilisant "ls" à la place de "printf", voici une alternative sûre. Toutefois, selon l'opinion de votre opinion, "ls" n'est pas sans danger pour une utilisation dans un script. Dans ce cas, utiliser 'printf' avec la correspondance de motif glob est considéré comme sûr. Si vous allez utiliser ceci dans un script, le résultat de 'printf' ne contiendra pas de nouveau caractère de ligne jusqu'à la fin du flux de sortie en tant que tel:

printf "%s" /path/to/files/ABC*  

Résultats:

/path/to/files/ABC /path/to/files/ABC123

Si vous avez besoin de sauts de ligne après chaque instance:

printf "%s\n" /path/to/files/ABC*

Résultats:

/path/to/files/ABC 

/path/to/files/ABC123

"/ path / to / files /" reste dans la sortie si vous l'avez entré de cette manière lors de l'exécution de la commande 'printf'. Sans cela, seul le nom du fichier apparaît:

printf "%s" ABC* 

Résultats

ABC ABC123

En supposant que vous exécutiez la commande dans le répertoire dans lequel les fichiers existent.


Ce echo /path/to/files/ABC* | tr " " "\n"n'est pas une bonne idée. Considérez s'il y a un fichier /path/to/files/ABC EFG, il y a un espace dans le nom du fichier. Vous trallez diviser le nom de fichier en deux lignes distinctes, ce qui n’est pas bon. Pire encore s'il y a plusieurs espaces dans le nom du fichier. Je vous recommanderais printf "%s\n" ABC*plutôt d' utiliser ce qui devrait aider avec les espaces dans les noms de fichiers, mais reste problématique avec d'autres caractères spéciaux comme\n
Sergiy Kolodyazhnyy le

0

Command-t dans l'un de mes plugins vim préférés, c'est un plugin basé sur ruby, au-dessus de l'intégration avec FZF.

En utilisant Comamnd-T et FZF, vous pouvez effectuer la recherche avec un mécanisme extrêmement "fuzzy" pour:

  • Ouverture de fichiers et de tampons
  • Saut aux tags et aide
  • Exécution de commandes ou recherches et commandes précédentes
  • avec un nombre minimal de frappes.

Comme vous pouvez le voir

entrez la description de l'image ici

Je cherche toujours dans l'historique des commandes en ouvrant un nouveau terminal et clique sur:

CTRL+R

En plus de la recherche récursive dans tous les dossiers en écrivant dans n’importe quel onglet de terminal:

fzf

Puis commencez votre nom de fichier

ABC

En outre, vous pouvez écrire à l'intérieur vim

:CommandT 

Vraiment utile surtout dans les grands dossiers.


0

Supposons que je suis au répertoire racine et que je ne veux que la liste du répertoire etc: nous écrivons,

find -type d -name "etc"

résultat nous obtenons,

[root@unix /]# find -type d -name "etc"

./etc
./usr/lib/firefox/bundled/etc
./usr/lib/unix-yarn/etc
./usr/lib/unix/etc
./usr/lib/festival/etc
./usr/bin/lib/vmware-tools/lib64/libconf/etc
./usr/bin/lib/vmware-tools/lib32/libconf/etc
./usr/etc
./usr/share/doc/oddjob-0.30/sample/etc
./usr/share/festival/lib/etc
./usr/local/etc
./usr/java/jdk1.7.0_25/lib/visualvm/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib64/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib32/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/caf/etc

Un autre exemple,

Nous pouvons aussi écrire:

ls | grep "etc"

on a,

etc
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.