Disons que j'ai deux fichiers dans /tmp
:
root@ubuntu:~# touch /tmp/hello.{pyc,py}
root@ubuntu:~# ls /tmp/
hello.py hello.pyc
Maintenant, permet d'exécuter la rm -rf
commande avec l'option [co]
root@ubuntu:~# rm -rf /tmp/hello.py[co]
root@ubuntu:~# ls /tmp/
hello.py
Quelqu'un peut-il expliquer ce qui se passe ici? Quel est le [co]
paramètre? Comment pouvons-nous le faire fonctionner pour d'autres extensions? Dire que j'ai foo.js
et foo.coffee
fichiers, pouvons - nous faire quelque chose comme rm -rf /tmp/foo.coffe[co]
de supprimer le /tmp/foo.js
?
command-line
bash
rm
aneeshep
la source
la source
-rf
, car ce ne sont ni des répertoires (--recursive
), ni des caractères non inscriptibles (--force
).-rf
et il n'est pas nécessaire de faire les choses en tant que root. Surtout si les choses en question impliquentrm -rf
.[co]
shell glob. Merci.Réponses:
[co]
n'est pas un paramètre de larm
commande - c'est un glob de shell qui correspond à un modèle égal à un seul caractère de l'ensemble[co]
- en d'autres termes, il correspond à ac
ou ào
la fin du nom de fichier. Deman bash
:Pour faire correspondre les deux
foo.coffee
etfoo.js
, comme les suffixes ne contiennent aucune sous-chaîne commune, le mieux que vous puissiez faire est de fairefoo.*
correspondre n'importe quel nom de fichier commençant par À lafoo.
place, vous pouvez utiliser l' expansion d'accolade, par exemplela source
[abc]
ou*
va rechercher des fichiers tout{}
ne sera pas. allez dans / tmp, tapezecho nya[ab]; echo nya{a,b}
, puistouch nyaa
et encoreecho nya[ab]; echo nya{a,b}
Ce n'est pas un paramètre mais une collection de lettres (ou un "shell glob"). C'est pareil:
est le même que
Similaire ...
supprimerait quoi que ce soit de
/tmp/hello.pyc
jusqu'à et y compris/tmp/hello.pyo
commande ASCII suivante.supprimerait ...
Vous pouvez créer des méthodes plutôt sophistiquées, mais pour ces 2 fichiers, je les supprimerais simplement avec 1 commande pour chacun. Un autre exemple se rapprochant le plus possible de ces 2 fichiers ...
supprimerait des fichiers comme celui-ci ...
il comprendrait donc bien plus que ces 2 fichiers.
la source
rm -rf
toutes les correspondances, pas beaucoup d'invocations chacune avec une correspondance.C'est un glob de shell, similaire aux caractères génériques
*
et?
... en bash, le modèle de nom de fichier*.[co]
correspond à tous les noms de fichiers qui se terminent par.c
ou.o
.La différence avec
*.[co]
versus*.c *.o
ou*.{c,o}
est que les deux derniers modèles se développeront en un faux*.o
si aucun.o
fichier n'existe dans le répertoire, alors que la*.[co]
version ne le fera pas.Les globes shell sont utiles pour effectuer des opérations sur les fichiers sans respecter la casse. Par exemple, si vous avez un tas de fichiers avec des noms qui se terminent par
jpg
,JPG
,Jpg
,JPg
, etc ... et que vous voulez supprimer tous, vous pouvez le faire:la source