Disons que j'ai deux fichiers dans /tmp
:
root@ubuntu:~# touch /tmp/hello.{pyc,py}
root@ubuntu:~# ls /tmp/
hello.py hello.pyc
Maintenant, exécutons la commande rm -rf
avec l'option [co]
root@ubuntu:~# rm -rf /tmp/hello.py[co]
root@ubuntu:~# ls /tmp/
hello.py
Quelqu'un peut-il s'il vous plaît expliquer ce qui se passe ici? Quel est le paramètre [co]
? Comment pouvons-nous le faire fonctionner pour d'autres extensions? Supposons que j'ai des fichiers foo.js
et foo.coffee
. Pouvons-nous faire quelque chose comme rm -rf /tmp/foo.coffe[co]
pour supprimer le /tmp/foo.js
?
[co]
n'est pas un paramètre de la commande rm
- c'est un shell glob qui correspond à un motif égal à un seul caractère de l'ensemble [co]
- en d'autres termes, il correspond à un c
ou à un o
fin du nom de fichier. De man bash
:
[...] Matches any one of the enclosed characters
Pour faire correspondre les foo.coffee
et foo.js
, étant donné que les suffixes ne contiennent aucune sous-chaîne commune, le mieux que vous puissiez faire est foo.*
qui correspondrait à any nom de fichier commençant par foo.
à la place, vous pourriez utiliser expansion du corset par exemple.
rm foo.{coffee,js}
Ce n'est pas un paramètre mais une collection de lettres (ou un "shell glob"). C'est pareil:
rm -rf /tmp/hello.py[co]
est le même que
rm -rf /tmp/hello.pyc
rm -rf /tmp/hello.pyo
Similaire ...
rm -rf /tmp/hello.py[c-o]
supprimerait tout élément de /tmp/hello.pyc
jusqu'à /tmp/hello.pyo
inclus après ASCII ordre.
rm -rf /tmp/hello.py[ab][cd]
enlèverait ...
rm -rf /tmp/hello.pyac
rm -rf /tmp/hello.pyad
rm -rf /tmp/hello.pybc
rm -rf /tmp/hello.pybd
disons, j'ai les fichiers foo.js et foo.coffee, pouvons-nous faire quelque chose comme
rm -rf /tmp/foo.coffe[co]
pour supprimer le/tmp/foo.js
.
Vous pouvez faire des méthodes assez sophistiquées, mais pour ces 2 fichiers, je les enlèverais simplement avec 1 commande pour chaque Un autre exemple se rapprochant le plus possible de ces 2 fichiers ...
rm /tmp/foo.[cj]*
supprimerait des fichiers comme celui-ci ...
rm /tmp/foo.c*
rm /tmp/foo.j*
il comprend donc bien plus que ces 2 fichiers.
C'est un glob Shell, similaire aux caractères génériques *
et ?
... sous bash, le motif de nom de fichier *.[co]
correspond à tous les noms de fichiers se terminant par .c
ou .o
.
La différence avec *.[co]
par rapport à *.c *.o
ou *.{c,o}
réside dans le fait que les deux derniers modèles seront étendus à un code factice *.o
si aucun fichier .o
n'existe dans le répertoire, contrairement à la version *.[co]
.
Les globs shell sont utiles pour effectuer des opérations sur les fichiers de manière non sensible à la casse. Par exemple, si vous avez un groupe de fichiers dont le nom de fichier se termine par jpg
name__, JPG
name__, Jpg
name__, JPg
name__, etc ... et que vous voulez tous les supprimer, vous pouvez le faire:
rm *.[Jj][Pp][Gg]