web-dev-qa-db-fra.com

Problème avec l'utilisation de caractères génériques lorsque je fais une commande CP dans le terminal

Je suis nouveau et j'essaie d'apprendre la commande de terminal. Aujourd'hui, j'ai rencontré un problème avec l'option de commande cp wildcard. J'ai écrit dans Terminal cette commande

cp Downloads/[:alnum:]  test/

Ici, Downloads est le répertoire à partir duquel je souhaite copier le fichier de caractères alphanumériques dans mon répertoire test. Mais quand j'ai exécuté cette commande m'a montré:

cannot stat ‘Downloads/[:alnum:]’: No such file or directory

Je veux savoir comment utiliser les classes Wildcard ci-dessus pour la commande cp. Et aussi comment je peux utiliser la commande de caractère générique ci-dessus.

Les caractères génériques sont

 * 
? 
[characters]
[!characters]
[[:classes:]]

Les classes couramment utilisées sont

[:alnum:]-> Match any Alphanumeric Character
[:alpha:] -> Match any Alphabetic Character
[:digit:] -> Match any nummeral 
[:lower:] -> Matches any lowercase letter
[:upper:] -> Matches any Uppercase letter

Comment puis-je utiliser ces caractères génériques et leurs classes?

1
Garten786

cp ne prend pas en charge les caractères génériques par lui-même. L'expansion des caractères génériques et des modèles est effectuée par le shell, qui est bash par défaut.

Dans tous les cas, les classes de caractères doivent être spécifiées dans [] - qui exclut le [] les entourant déjà. Ainsi:

cp Downloads/[[:alnum:]] test/

Pourtant, [[:alnum:]] ne correspondra qu'à un seul caractère alphanumérique. Pour faire correspondre tous les noms de fichiers contenant uniquement des caractères alphanumériques ne peut pas être fait avec seulement les caractères génériques déjà répertoriés. Pour un filtrage plus puissant, consultez la commande find:

find . -regextype posix-extended -maxdepth 1 -regex '.*/[[:alnum:]]*'

Dans bash, vous pouvez utiliser globs étendus :

shopt -s extglob
cp Downloads/*([[:alnum:]]) test/
3
muru

[:alnum:] correspond en fait à un seul caractère de l'ensemble:, a, l, n, u, m c'est-à-dire donné

$ ls
_?_  123  7  a  abc  :file  fi:le  m

ensuite

$ ls [:alnum:]
a  m

Pour faire correspondre un seul caractère alphanumérique classe[:alnum:] il doit être [[:alnum:]]

$ ls [[:alnum:]]
7  a  m

Pour faire correspondre un seul caractère alphanumérique suivi de zéro ou plusieurs caractères arbitraires

$ ls [[:alnum:]]*
123  7  a  abc  fi:le  m

Pour faire correspondre un fichier composé niquement de caractères alphanumériques à l'aide du remplacement de Shell, il faut une syntaxe glob étend (extglob)

$ ls +([[:alnum:]])
123  7  a  abc  m
2
steeldriver