Como você usa expressões regulares com o comando cp no Linux?

19

Eu estou tentando copiar apenas um subconjunto de arquivos de um diretório para outro usando cp , mas sou recebido com a mensagem cp: cannot stat [^\.php]': No such file or directory . Existe uma maneira de usar expressões regulares usando apenas o comando cp ?

    
por PeanutsMonkey 25.06.2012 / 20:05

2 respostas

24

Não.

O comando cp não possui a capacidade de processar qualquer um dos seus argumentos como expressões regulares. Mesmo curingas não são manipulados por ele (ou pela maioria dos executáveis); em vez disso, eles são manipulados pela casca.

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 desejará examinar o utilitário find 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 comando cp (presumindo que o find não tenho um manipulador embutido para copiar arquivos; não estou intimamente familiarizado com a ferramenta).

Você pode tentar:

find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;

Isso diz para procurar recursivamente no diretório atual por arquivos que não contenham ".php" no caminho e copiá-los em /destination/folder/ .

Conforme solicitado, um detalhamento mais específico dos argumentos:

  • . - Localização para iniciar a pesquisa - neste 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.*" - Expressão regular correspondente a <Anything>.php<Anything> - Qualquer arquivo que tenha ".php" em algum lugar no caminho. (Nota, incluindo estar dentro de uma pasta que contém ".php" no nome, você precisaria de uma expressão mais complexa para corresponder apenas aos arquivos)
  • -exec - Executa 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 encontrar 'deve ser executado em cada um dos nomes de caminho correspondente.
  • {} - O caminho para o arquivo que foi encontrado, passado para cp como um argumento para que ele saiba qual arquivo copiar
  • /destination/folder/ - argumento passado para cp , informando cp para onde deve copiar o arquivo.
  • \; - Este é o ; terminator que -exec está procurando. Nós escapamos com um \ para que seu shell não tente analisá-lo e, em vez disso, o alimente como um argumento para o comando ( find )

É muito difícil escrever uma expressão regular que corresponda a "strings que não têm .php ", então, em vez disso, dizemos find para pesquisar strings que do contêm .php e inverta os resultados com ! .

    
por 25.06.2012 / 20:10
9

Você pode usar algumas outras ferramentas do console, como grep e xargs.

ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder
    
por 25.06.2012 / 20:13

Tags