25 votes

Comment utiliser les expressions régulières avec la commande cp sous Linux ?

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 ?

34voto

Darth Android Points 36975

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'argument cp , racontant cp 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 ! .

10voto

0xAF Points 699

Vous pouvez utiliser d'autres outils de la console, comme grep et xargs.

ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder

-1voto

Nisan Chhetri Points 1

Vous pouvez exécuter la commande suivante, facile à utiliser :

find /home/usr/search_dir -iname *file_name_portion*.txt | xargs cp -t /home/usr/destination_folder

cool haa !!

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X