Tenho muitos arquivos (com .fna
extensã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 -l
opção para que correspondências positivas retornem apenas nomes de arquivos) comxargs
você 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 tr
comando atua em sua entrada, esperada na REPLY
variável, excluindo tudo que não seja a >
, depois pede wc
para contar o número de caracteres resultantes e compara essa saída com 9.
A segunda linha executa o mv
comando para combinar arquivos *.fna com o location
diretó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.