Não.
O cp
comando não possui a capacidade de processar nenhum de seus argumentos como expressões regulares. Até curingas não são manipulados por ele (ou pela maioria dos executáveis); ao contrário, eles são manipulados pela concha.
cp test/* test2/
é realmente expandido pelo bash, e tudo o que cp
realmente vê para seus argumentos é cp test/file1 test/file2 test/file3 test2/
(ou o que for apropriado com base no conteúdo real de test/
).
Além disso, não acho que sua expressão [^\.php]
corresponda ao que você deseja (não corresponde apenas aos arquivos que contêm .php
).
Você provavelmente deseja examinar o find
utilitário para filtrar uma lista de arquivos com base na expressão regular e, em seguida, usar xargs
para aplicar a lista de arquivos retornados ao cp
comando (presumindo que find não tenha um manipulador interno para copiar arquivos; eu ' não estou intimamente familiarizado com a ferramenta).
Você pode tentar:
find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;
Isso diz para procurar no diretório atual recursivamente os arquivos que não contêm ".php" no caminho e copiá-los para /destination/folder/
.
Conforme solicitado, uma análise mais específica dos argumentos:
.
- Local para iniciar a pesquisa - nesse caso, o diretório atual
!
- Operador "Não", inverta o resultado do próximo teste
-iregex
- Teste de expressão regular sem distinção entre maiúsculas e minúsculas. O próximo argumento é a expressão.
".*\.php.*"
- Correspondência de expressão regular <Anything>.php<Anything>
- Qualquer arquivo que tenha ".php" em algum lugar do caminho. (Observe que, além de estar dentro de uma pasta que contenha ".php" no nome, você precisará de uma expressão mais complexa para corresponder apenas aos arquivos)
-exec
- Execute um comando se os testes anteriores retornarem true. O próximo argumento é o comando, todos os argumentos restantes até ;
são passados para o comando. o {}
é um argumento especial que representa o nome do arquivo.
cp
- O comando que find` deve ser executado em cada um dos nomes de caminhos correspondentes.
{}
- O caminho para o arquivo que foi encontrado, passado cp
como argumento para que ele saiba qual arquivo copiar
/destination/folder/
- argumento passado para cp
, dizendo para cp
onde deveria copiar o arquivo.
\;
- Este é o ;
terminador que você -exec
está procurando. Nós o escapamos com um \
para que seu shell não tente analisá-lo e, em vez disso, o alimenta como um argumento para o comando ( find
)
É bastante difícil de escrever uma expressão regular que corresponde a "cordas que não têm .php
", de modo que em vez dizer find
para procurar strings que não contêm .php
e depois invertido os resultados com !
.
find . -name [^\.php] -exec cp {} /path/to/location \;
tenha cuidado com arquivos com caracteres especiais.