web-dev-qa-db-fra.com

Que signifie [co] dans la commande "rm -rf filename [co]"?

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?

15
aneeshep

[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}
34
steeldriver

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.

16
Rinzwind

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 jpgname__, JPGname__, Jpgname__, JPgname__, etc ... et que vous voulez tous les supprimer, vous pouvez le faire:

rm *.[Jj][Pp][Gg]
1
delt