Non.
Le cp
La commande ne possède pas la capacité de traiter l'un 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 ça cp
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 (il ne correspond pas uniquement aux fichiers contenant .php
).
Vous voulez probablement vous pencher sur le 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 retournée au cp
commande (en supposant que find n'a pas de gestionnaire intégré pour copier des fichiers ; je ne connais pas intimement l'outil).
Vous pouvez 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 dans /destination/folder/
.
Comme demandé, une répartition plus précise des arguments :
.
- Emplacement pour démarrer la recherche - dans ce cas, le répertoire courant!
- Opérateur "Non", inverse le résultat du prochain test-iregex
- Test d'expression régulière insensible à la casse. L'argument suivant est l'expression.".*\.php.*"
- Expression régulière correspondant à<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 correspondre uniquement aux fichiers)-exec
- Exécute une commande si les tests précédents retournent vrai. L'argument suivant est la commande, tous les arguments restants jusqu'à;
sont passés à la commande. le{}
est un argument spécial représentant le nom du fichier.cp
- La commande find` doit s'exécuter sur chacun des noms de chemin correspondants.{}
- Le chemin du fichier trouvé, passé àcp
comme argument pour qu'il sache quel fichier copier/destination/folder/
- argument passé àcp
, indiquantcp
où il doit copier le fichier.\;
- C'est le;
terminateur qui-exec
cherche. On y échappe avec un\
afin que votre shell n'essaie pas de l'analyser et le fournisse à la place en tant qu'argument de la commande (find
)
Il est plutôt difficile d'écrire une expression régulière qui correspond à "des chaînes qui n'ont pas .php
", nous disons donc à la place find
pour rechercher des chaînes qui font contient .php
puis inverser les résultats avec !
.
Vous pouvez utiliser quelques autres outils de la console, comme grep et xargs.
ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder