Quel est l'équivalent Linux de DOS "dir / s / b filename"?


17

Répertorie tous les fichiers / répertoires dans ou sous le répertoire actuel qui correspondent à "nom de fichier".

Réponses:


28

L'équivalent direct est

find . -iname <filename>

qui listera tous les fichiers et répertoires appelés <filename>dans le répertoire courant et tous les sous-répertoires, en ignorant la casse.

Si votre version de find ne prend pas en charge -iname, vous pouvez utiliser à la -nameplace. Notez que contrairement à -iname, -nameest sensible à la casse.

Si vous souhaitez uniquement répertorier les fichiers appelés <filename>et non les répertoires, ajoutez-type f

find . -iname <filename> -type f

Si vous souhaitez utiliser des caractères génériques, vous devez mettre des guillemets autour, par exemple

find . -iname "*.txt" -type f

sinon le shell va le développer.

Comme d'autres l'ont souligné, vous pouvez également:

find . | grep "\.txt$"

grep imprime des lignes basées sur des expressions régulières, qui sont plus puissantes que les caractères génériques, mais ont une syntaxe différente.

Voir man findet man greppour plus de détails.


3
Si <filename>contient des caractères génériques, utilisez des guillemets autour, par exemple find . -name '*.txt'.
Gilles 'SO- arrête d'être méchant'

@Gilles, a mis à jour ma réponse pour le dire, merci.
Mikel

2
L'utilisation <filename>comme marqueur pour l'entrée d'utilisateur est une mauvaise habitude dans un environnement de ligne de commande, où la < and >plupart du temps a une signification spécifique. Je suggère simplement d'utiliser filename, peut-être FILENAME pour le souligner. La plupart des gens comprendront, et ceux qui ne le feront pas, pourraient nuire lorsqu'ils ne comprennent pas qu'ils ne sont pas censés frapper un signe inférieur ou supérieur à.
utilisateur inconnu

2
<filename>est une convention dans beaucoup de documentation UNIX, donc je pense qu'il est utile que les gens en soient conscients, mais je suis d'accord FILENAMEpour être plus facile à comprendre.
Mikel

1
find -iname <filename>est meilleur car il est insensible à la casse comme DOS
Agnel Kurian

8

Certains obus le permettent ls **/filename, ce qui est assez pratique.


1
Bon point. Dans les versions récentes de bash, l'exécution shopt -s globstar; echo **/filenameéquivaut à find . -name "filename". Il fonctionne également en zsh.
Mikel

Ce «ls ** / nom de fichier» est correct, mais ne semble pas aller plus loin qu'un niveau de répertoire.
Sopalajo de Arrierez

@ sopalajo-de-arrierez Si vous le faites shopt -s globstar, cela fonctionnera probablement pour vous. La globalisation récursive est une fonctionnalité qui n'est disponible que dans certains shells, et parfois, elle n'est pas activée par défaut.
Shawn J. Goff

Ops ... Je comprends maintenant, @ ShawnJ.Goff: la shoptcommande active l'option globstar on. Maintenant, cela fonctionne comme un charme. Merci beaucoup.
Sopalajo de Arrierez

4

Vous pouvez le faire avec

find . | egrep filename

1
Vous pouvez également le faire en un seul avec find . -regextype posix-egrep -regex '.*filename.*'(je ne sais pas si la egreppartie est importante, mais vous l'avez utilisée egrepdans votre réponse, donc je l'ai incluse)
Michael Mrozek

Vous pouvez, mais grep est différent de la commande DOS équivalente. greputilise des expressions régulières, tandis que la commande DOS utilise des caractères génériques shell.
Mikel

1
À bien y penser, les globes shell sont également différents des caractères génériques DOS. Par exemple, find . -name "*.*"ne fera pas ce que vous attendez d'un arrière-plan DOS. Les globes sont assez proches pour être reconnaissables, cependant, tandis que les regex sont une bête entièrement nouvelle.
Jander

Que fait *.*.*-on dans un dos moderne c.-à-d. Windows cmd? Et alors *.*.*.*?
ctrl-alt-delor

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.