5 votes

Recherche de *.swo

Je pense que ça devrait être facile, mais je n'y arrive pas.

Lorsque j'utilise la commande suivante, le fichier est trouvé.

$ ls -al  .bash_*.sw*   
-rw-r--r--  1 damiensawyer  staff  12288 27 Nov 07:39 .bash_profile.swo

Mais quand j'utilise ça, ça ne le trouve pas.

$ ls -al *.sw*      
ls: *.sw*: No such file or directory

Je m'attendais à ce que la deuxième commande renvoie également .bash_profile.swo . Qu'est-ce que je rate ?

6voto

joeytwiddle Points 161

Cela n'est pas dû à ls puisque ls ne développe jamais de modèles.

La décision sur la façon d'étendre les motifs globaux (motifs contenant du * y ? ) est fait par la coquille . Votre coquille est très probablement bash .

Par défaut bash n'effectue pas expansion des chemins sur dotfiles. Cependant, il peut le faire soit en écrivant explicitement la balise . (comme vous l'avez déjà découvert) ou en activant l'option dotglob option. De la page de manuel de bash :

dotglob S'il est défini, bash inclut les noms de fichiers commençant par un `.' dans les résultats de l'expansion du nom de chemin.

Pour démontrer, nous allons simplement imprimer l'expansion avec echo au lieu de ls :

$ touch .bash_profile.swo

$ echo .*.swo
.bash_profile.swo

$ echo *.swo
*.swo

$ shopt -s dotglob

$ echo *.swo
.bash_profile.swo

Une discussion plus approfondie peut être trouvée aquí .

4voto

DigitalRoss Points 80400

Utilisation de ls

Le problème est que votre fichier a deux points, pas un. Vous devez en tenir compte :

ls -al .*.sw*

Cela correspondra à tout fichier commençant par un point (fichiers invisibles tels que .DS_Store ) et se termine également par .sw* .

.swa ainsi que .swz correspondra.


Utilisation de find

Vous pouvez utiliser la commande suivante pour trouver tous les fichiers ayant la même extension ( swo dans le cas ci-dessous) dans un répertoire.

find ~ -iname *swo

-iname trouve une correspondance insensible à la casse.


Vous pouvez rechercher ce(s) fichier(s) spécifique(s) en utilisant ceci :

find .bash_*.sw*

Remarque : L'utilisation de ~ car le chemin d'accès cherchera dans tout votre répertoire personnel.

3voto

yoliho Points 340

Le problème est que ls ne montre que les fichiers qui commencent par un . vous devez explicitement avoir le premier . dans le fichier glob.

Ainsi, la méthode suivante fonctionnera :

ls .*swo

Les shells Unix développent le glob avant ls voit les noms des fichiers.

2voto

Wolfgang Points 121

Ces motifs ( *.sw* et autres) sont connus sous le nom de gants .

Comme @Mark et @Zach Gates l'ont noté, les goujons ne correspondent pas aux fichiers dont le nom commence par un point, à moins que vous n'incluiez explicitement une balise . au début du motif. En effet, dans les systèmes de type UNIX (tels que OS X), les fichiers qui commencent par un point sont considérés comme des fichiers "cachés" et ne sont généralement pas affichés par défaut.

La correspondance Glob est en fait effectuée par votre shell ( bash par défaut), et non par des commandes individuelles telles que ls . Comme l'explique le manuel bash sous Expansion du fichier :

Après le découpage des mots... Bash recherche dans chaque mot les caractères ' * ', ' ? ', et ' [ '. Si l'un de ces caractères apparaît, le mot est considéré comme un motif, et remplacé par une liste de noms de fichiers triés par ordre alphabétique et correspondant au motif (voir Correspondance de motifs). Si aucun nom de fichier correspondant n'est trouvé,... le mot est laissé inchangé.

Lorsqu'un motif est utilisé pour l'expansion du nom de fichier, le caractère ' . Au début d'un nom de fichier ou immédiatement après une barre oblique, la correspondance doit être effectuée explicitement, sauf si l'option shell dotglob est réglé.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X