Como filtrar alguns arquivos do meu diretório?

2

Eu tenho alguns arquivos no meu diretório. Eles podem ser classificados em duas categorias: o padrão de nome dos arquivos na classe um é como 1000-24-1-7-1 , que tem cinco números separados por quatro traços; o padrão de nome dos arquivos na classe dois é como abcd-1000-24-1-7-1-efgh-ijkl , que também são separados por traço, mas têm letras antes ou depois ou antes e depois desses números.

Minha pergunta é como filtrar esses arquivos na classe um do meu diretório, movendo-os para um diretório chamado por first-class .

    
por Yulong Ao 19.04.2015 / 15:57

3 respostas

3

Com alguns shells, você poderia usar globbing + flags extras para corresponder apenas a arquivos em classe um .
Com bash :

shopt -s extglob
for one in +([0-9])-+([0-9])-+([0-9])-+([0-9])-+([0-9])
    do
        [[ -f $one ]] && mv -- "$one" first-class
    done

+(<PATTERN>) corresponde a uma ou mais ocorrências do padrão especificado, [[ -f ... ]] testa o arquivo normal - se sim, é mv -ed first-class ; Para executar um dry-run , adicione echo na frente de mv .

com zsh :

setopt extended_glob
mv -t first-class [0-9]##(-[0-9]##)(#c4)(.)

x## corresponde a uma ou mais ocorrências do padrão x , (#cN) exige exatamente N correspondências e (.) corresponde somente a arquivos
ou:

autoload zmv
zmv -Q '[0-9]##(-[0-9]##)(#c4)(.)' first-class

-Q ativa os qualificadores de globo nu, para executar a seco adicionar -n , por exemplo zmv -Qn ...

Se não for necessário filtrar arquivos regulares, você poderá fazer isso sem o teste em bash :

shopt -s extglob
mv -- +([0-9])-+([0-9])-+([0-9])-+([0-9])-+([0-9]) first-class

e sem o qualificador (.) em zsh :

setopt extended_glob
mv -t first-class [0-9]##(-[0-9]##)(#c4)

ou

autoload zmv
zmv '[0-9]##(-[0-9]##)(#c4)' first-class
    
por 20.04.2015 / 13:59
3

A solução de Bjorn parece que deveria funcionar, mas outra possibilidade seria usar o find com um regex como find -regextype posix-extended -regex '.*/[[:digit:]]{1,}(-[[:digit:]]{1,}){4}$' , então você pode usar isso com -exec mv {} first-class \; ou pipe to xargs ou similar

    
por 19.04.2015 / 16:32
2

Não será que mv [0-9]*-[0-9]*-[0-9]*-[0-9]* first-class faz o truque?

    
por 19.04.2015 / 16:27