mover arquivos que contenham um padrão um certo número de vezes

mover arquivos que contenham um padrão um certo número de vezes

Tenho muitos arquivos (com .fnaextensão). Preciso movê-los, se eles contiverem o caractere>um certo número de vezes.

Eu sei quais arquivos contêm>um certo número de vezes (9 vezes neste exemplo) com este comando.

grep -c ">" *.fna | grep ":9"

O que dá uma saída como esta

5242_ref.fna:9
9418_ref.fna:9

Mas não sei como mover esses arquivos para outra pasta.

Obrigado.

Responder1

Combinando egrep(chamado com a -lopção para que correspondências positivas retornem apenas nomes de arquivos) comxargsvocê pode executar comandos arbitrários com base em correspondências de texto:

[gnubeard@mothership: ~/mver]$ ls
destination  example.fna  non_example.fna
[gnubeard@mothership: ~/mver]$ cat example.fna
>>>>>>>>>
[gnubeard@mothership: ~/mver]$ cat non_example.fna
<<<<<<<<<
>>
[gnubeard@mothership: ~/mver]$ egrep -l '>{9}' *.fna | xargs -I{} mv {} destination/
[gnubeard@mothership: ~/mver]$ ls
destination  non_example.fna
[gnubeard@mothership: ~/mver]$ ls destination/
example.fna

Editar: Isso não corresponde a arquivos com um certo número de instâncias de um caractere, se eles estiverem separados por outros caracteres ou novas linhas. Eu criei este pequeno script que deve funcionar conforme desejado.

#! /usr/bin/env bash

DESTINATION=./destination
MATCH_CHAR='>'
MATCH_COUNT=9

for FILE in $1; do
  MATCHES=$(grep -o $MATCH_CHAR $FILE | wc -l)
  if [ $MATCHES -eq $MATCH_COUNT ]; then
    mv $FILE $DESTINATION
  fi
done

Exemplo:

[gnubeard@mothership: ~/mver]$ ls
destination  example.fna  mver  non_example.fna
[gnubeard@mothership: ~/mver]$ cat example.fna
>>
>>foo>>bar>>>baz
[gnubeard@mothership: ~/mver]$ cat non_example.fna
<<<<<<<<<
>>
[gnubeard@mothership: ~/mver]$ ./mver *.fna
[gnubeard@mothership: ~/mver]$ ls destination/
example.fna
[gnubeard@mothership: ~/mver]$ ls
destination  mver  non_example.fna

Responder2

Você poderia usar zsh com seuexpressão-como-qualificador-globpara selecionar arquivos que possuem apenas nove desses símbolos:

$ hasnine() { [[ $(tr -dc '>' < "$REPLY" | wc -c) -eq 9 ]]; }
$ mv *.fna(+hasnine) location/

A primeira linha define uma função cujo objetivo é criar um filtro verdadeiro/falso para arquivos que contenham nove >símbolos. O trcomando atua em sua entrada, esperada na REPLYvariável, excluindo tudo que não seja a >, depois pede wcpara contar o número de caracteres resultantes e compara essa saída com 9.

A segunda linha executa o mvcomando para combinar arquivos *.fna com o locationdiretório (exemplo). Os arquivos *.fna correspondentes também precisam passar pelo qualificador de expressão, que é fornecido como o nome da função que definimos.

informação relacionada