como mover um arquivo depois de identificá-lo com ls | egrep, ou “egrep” vs “find”

0

Eu preciso mover todas as imagens com uma string de nome de arquivo específica para um diretório específico.

Este é um nome de arquivo de exemplo

facility_92+SOURCE1+SOURCE1.0

Após o 'facility_', pode haver de 1 a 5 dígitos.

O seguinte retornará uma lista dos arquivos que desejo mover:

ls | egrep "facility_([0-9]*)\+SOURCE[0-9]*"

No entanto, fico preso ao tentar mover qualquer coisa que isso retorne. Eu tentei usar o find para mover arquivos correspondentes para a pasta movida:

for f in 'find ./ | ls | egrep "facility_([0-9]*)\+SOURCE[0-9]*"'; do mv $f moved/; done

Mas recebo um número de erros em que mv analisa as condições como uma string ...

Eu tive outra alternativa com '-exec':

find ./ | ls | egrep "facility_([0-9]*)\+SOURCE[0-9]*" -exec mv moved 

Mas receba erros semelhantes ...

Conselho apreciado. Estou errado em tentar essa abordagem? Devo descobrir como fazer o mesmo regex em 'encontrar'?

    
por Jack 15.10.2018 / 09:57

1 resposta

3

Com find , você não deve concatenar comandos por meio da canalização.

Ele tem um bom sinalizador -regex para o qual você pode passar sua string de correspondência de nome de arquivo:

find . -regextype egrep -regex ".*facility_([0-9]*)\+SOURCE[0-9]*.*" -exec mv {} DIRECTORY \;

O% final \; passa cada um dos nomes de arquivos correspondentes para mv no lugar do {} .

Como você pode ver, você precisa usar .* no começo e no final da expressão regular porque find precisa ser mach no caminho todo :

-regex pattern
       File name matches regular expression pattern.  This is a match on the whole path, not a search. For  example, to  match  a  file named './fubar3', you can use the regular expression '.*bar.' or '.*b.*3', but not 'f.*r3'.
    
por 15.10.2018 / 10:04