No.
El cp
comando no posee la capacidad de procesar ninguno de sus argumentos como expresiones regulares. Incluso los comodines no son manejados por él (o la mayoría de los ejecutables); más bien son manejados por el caparazón.
cp test/* test2/
en realidad se expande con bash, y todo lo que cp
realmente ve por sus argumentos es cp test/file1 test/file2 test/file3 test2/
(o lo que sea apropiado en función del contenido real de test/
).
Además, no creo que su expresión [^\.php]
coincida con lo que desea (no coincide solo con los archivos que contienen .php
).
Probablemente desee examinar la find
utilidad para filtrar una lista de archivos basada en la expresión regular, y luego usarla xargs
para aplicar la lista de archivos devueltos al cp
comando (suponiendo que find no tiene un controlador incorporado para copiar archivos; I ' No estoy íntimamente familiarizado con la herramienta).
Puedes probar:
find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;
Esto dice que busque en el directorio actual de forma recursiva archivos que no contengan ".php" en la ruta y los copie /destination/folder/
.
Según lo solicitado, un desglose más específico de los argumentos:
.
- Ubicación para comenzar la búsqueda - en este caso, el directorio actual
!
- Operador "No", invierta el resultado de la próxima prueba
-iregex
- Prueba de expresión regular sin distinción entre mayúsculas y minúsculas. El siguiente argumento es la expresión.
".*\.php.*"
- Coincidencia de expresiones regulares <Anything>.php<Anything>
: cualquier archivo que tenga ".php" en algún lugar de la ruta. (Tenga en cuenta que, al estar dentro de una carpeta que contiene ".php" en el nombre, necesitaría una expresión más compleja para que solo coincida con los archivos)
-exec
- Ejecute un comando si las pruebas anteriores devuelven verdadero. El siguiente argumento es el comando, todos los argumentos restantes hasta ;
se pasan al comando. El {}
es un argumento especial que representa el nombre del archivo.
cp
- El comando que find` debe ejecutarse en cada uno de los nombres de ruta coincidentes.
{}
- La ruta al archivo que se encontró, pasada cp
como argumento para que sepa qué archivo copiar
/destination/folder/
- argumento pasado a cp
, indicando cp
dónde debe copiar el archivo.
\;
- Este es el ;
terminador que -exec
está buscando. Lo escapamos con un \
para que su shell no intente analizarlo y en su lugar lo alimente como un argumento para el comando ( find
)
Es bastante difícil escribir una expresión regular que coincida con "cadenas que no tienen .php
", por lo que le pedimos find
que busque cadenas que sí contengan .php
y luego invierta los resultados !
.
find . -name [^\.php] -exec cp {} /path/to/location \;
Tenga cuidado con los archivos con caracteres especiales.