Non.
La cp
commande ne possède la capacité de traiter aucun de ses arguments comme des expressions régulières. Même les caractères génériques ne sont pas gérés par lui (ou la plupart des exécutables); ils sont plutôt gérés par le shell.
cp test/* test2/
est en fait développé par bash, et tout ce cp
qui voit vraiment pour ses arguments sont cp test/file1 test/file2 test/file3 test2/
(ou tout ce qui est approprié en fonction du contenu réel de test/
).
De plus, je ne pense pas que votre expression, [^\.php]
correspondra à ce que vous voulez (elle ne correspond pas uniquement aux fichiers qui contiennent .php
).
Vous souhaitez probablement examiner l' find
utilitaire pour filtrer une liste de fichiers basée sur une expression régulière, puis utiliser xargs
pour appliquer la liste de fichiers renvoyée à la cp
commande (en supposant que find n'a pas de gestionnaire intégré pour copier des fichiers; je '' Je ne connais pas intimement l'outil).
Vous pourriez essayer:
find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;
Cela dit de rechercher récursivement dans le répertoire courant les fichiers qui ne contiennent pas ".php" dans le chemin et de les copier /destination/folder/
.
Comme demandé, une ventilation plus spécifique des arguments:
.
- Emplacement pour démarrer la recherche - dans ce cas, le répertoire courant
!
- Opérateur "Non", inverser le résultat du prochain test
-iregex
- Test d'expression régulière insensible à la casse. L'argument suivant est l'expression.
".*\.php.*"
- Correspondance d'expressions régulières <Anything>.php<Anything>
- Tout fichier contenant ".php" quelque part dans le chemin. (Remarque, y compris dans un dossier contenant ".php" dans le nom, vous auriez besoin d'une expression plus complexe pour ne faire correspondre que les fichiers)
-exec
- Exécutez une commande si les tests précédents renvoient true. L'argument suivant est la commande, tous les arguments restants jusqu'à ;
sont passés à la commande. l' {}
argument est spécial représentant le nom du fichier.
cp
- La commande qui trouve` doit s'exécuter sur chacun des noms de chemin correspondants.
{}
- Le chemin vers le fichier trouvé, passé cp
en argument pour qu'il sache quel fichier copier
/destination/folder/
- argument passé à cp
, indiquant cp
où il doit copier le fichier.
\;
- C'est le ;
terminateur -exec
recherché. Nous l'échappons avec un \
afin que votre shell n'essaye pas de l'analyser et le nourrit à la place comme argument de la commande ( find
)
Il est assez difficile d'écrire une expression régulière qui correspond à « des chaînes qui ne sont pas .php
», donc nous disons au lieu find
de rechercher des chaînes qui ne contiennent .php
, puis inverser les résultats avec !
.
find . -name [^\.php] -exec cp {} /path/to/location \;
attention aux fichiers avec des caractères spéciaux.