J'essaie de ne copier qu'un sous-ensemble de fichiers d'un répertoire à un autre à l'aide de cp
mais le message suivant s'affiche cp: cannot stat [^\.php]': No such file or directory
. Existe-t-il un moyen d'utiliser les expressions régulières uniquement à l'aide de la fonction cp
commande ?
Réponses
Trop de publicités?Non.
En cp
n'est pas en mesure de traiter ses arguments sous forme d'expressions régulières. Même les caractères génériques ne sont pas traités par la commande (ni par la plupart des exécutables) ; ils sont traités par le Shell.
cp test/* test2/
est en fait développée par bash, et tout cela cp
voit vraiment car ses arguments sont cp test/file1 test/file2 test/file3 test2/
(ou tout ce qui est approprié en fonction du contenu actuel de la page test/
).
Par ailleurs, je ne pense pas que votre expression soit la bonne, [^\.php]
correspondra à ce que vous voulez (il ne correspond pas seulement aux fichiers qui contiennent .php
).
Vous voudrez sans doute vous pencher sur la question de la find
pour filtrer une liste de fichiers sur la base d'une expression régulière, puis utiliser l'utilitaire xargs
pour appliquer la liste de fichiers renvoyée au cp
(en supposant que find ne dispose pas d'un gestionnaire intégré pour la copie de fichiers ; je ne suis pas intimement familier avec cet outil).
Vous pouvez essayer :
find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;
Cela signifie qu'il faut rechercher récursivement dans le répertoire actuel les fichiers qui ne contiennent pas ".php" dans le chemin d'accès et les copier dans /destination/folder/
.
Comme demandé, une analyse plus spécifique des arguments :
.
- Emplacement de départ de la recherche - dans ce cas, le répertoire actuel!
- Opérateur "Non", inverser le résultat du test suivant-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 : si vous vous trouvez dans un dossier dont le nom contient ".php", vous aurez besoin d'une expression plus complexe pour ne faire correspondre que les fichiers).-exec
- Exécute une commande si les tests précédents renvoient un résultat positif. L'argument suivant est la commande, tous les arguments restants jusqu'à;
sont transmises à la commande.{}
est un argument spécial représentant le nom du fichier.cp
- La commande que find` doit exécuter sur chacun des noms de chemin correspondant.{}
- Le chemin d'accès au fichier trouvé, transmis àcp
comme argument afin qu'il sache quel fichier copier/destination/folder/
- transmis à l'argumentcp
, racontantcp
où il doit copier le fichier.\;
- Il s'agit de la;
terminateur qui-exec
recherche. Nous nous en échappons avec un\
afin que votre Shell n'essaie pas de l'analyser et le transmette comme argument à la commande (find
)
Il est assez difficile d'écrire une expression régulière qui corresponde aux "chaînes de caractères qui n'ont pas de .php
"Nous disons donc à la place find
pour rechercher les chaînes de caractères qui faire contenir .php
puis inverser les résultats avec !
.