Encontre diretórios por extensão de arquivo e copiando / movendo somewherelse [closed]

0

Eu quero pesquisar por extensão de arquivo e por textos e depois copiar um arquivo binário dentro da mesma pasta. Por exemplo, estou no diretório A e, por fim, gostaria de copiar todos os arquivos *.gdx (em B , C , D ) para algum lugar.

A  
|-- B                               
|   |-- file1.out (a text file)                     
|   |-- file1.gdx (a binary file)            
|  
|-- C         
|   |-- file2.out (a text file)  
|   |-- file2.gdx (a binary file)  
|   
|-- D         
|   |-- file3.out (a text file)  
|   |-- file3.gdx (a binary file)  

Aqui está o meu código:

cd 'find . -maxdepth 2 -name "*.out"|xargs grep "sometext"| awk -F'/' '{print $2}'|sort -u ' && ' find . -maxdepth 2 -name "*.gdx" -print0|xargs -0 cp -t /somewhere' 

O problema aqui, se primeiro find capturar várias pastas, copie apenas um arquivo *.gdx da primeira pasta, nem todos os arquivos *.gdx de todas as pastas. Eu acredito que tem que ser feito por loop, mas não sei como roteiro.

    
por Akand 04.05.2018 / 16:48

1 resposta

0

com find :

find . -type f -name '*.out' -exec grep -q 'PATTERN' {} ';' \
    -exec sh -c 'cp "$1" "${1%.out}.gdx" /somewhere' sh {} ';'

Alternativamente:

find . -type f -name '*.out' -exec grep -q 'PATTERN' {} ';' \
    -exec sh -c 'for name do cp "$name" "${name%.out}.gdx" /somewhere; done' sh {} +

Isso localizaria todos os arquivos na pasta atual ou abaixo, cujos nomes terminam com .out . Se um arquivo .out tiver uma linha correspondente a PATTERN , o arquivo .gdx no mesmo diretório, com o mesmo prefixo de nome do arquivo .out , será copiado para /somewhere junto com o arquivo .out .

Nenhum teste é feito para saber se já existe uma entrada de diretório existente em /somewhere com o mesmo nome dos arquivos sendo copiados ou se o arquivo .gdx realmente existe para começar.

Veja também:

por 04.05.2018 / 17:52

Tags