como mover arquivos com vários padrões para o diretório específico, bash?

0

Precisa mover arquivos com vários padrões definidos, como:

Z_*ana_bwk_na_N*.png
Z_*ana_bwk_dwda*.png
Z_*ana_bwkman_dwdna*
Z_*ana_bwkman_dwdc*
Z_*EDZW*_nwv01*_p00_na_N*WV11.png
Z_*EDZW*_nwv01*_p00_nh_N*WV11.png
Z_*nwv01*_hsy_NA*.png
Z_*EDZW_*_htp_na_N_*_WV11SW.png
Z_*_rft_na_*.png
Z_*_r12*

de uma pasta definida para outra.

Como isso pode ser feito da melhor maneira econômica? Em um script, rodando a partir do cron?

Esses padrões podem ser definidos melhor no mesmo script ou em arquivos de texto separados, contendo-os?

    
por Draco 04.10.2017 / 14:06

3 respostas

0

A abordagem mais eficiente, mas possivelmente a menos legível, é simplesmente enumerar tudo em um grande e feliz comando mv .

mv Z_*ana_bwk_na_N*.png \
    Z_*ana_bwk_dwda*.png \
    Z_*ana_bwkman_dwdna* \
    Z_*ana_bwkman_dwdc* \
    Z_*EDZW*_nwv01*_p00_na_N*WV11.png \
    Z_*EDZW*_nwv01*_p00_nh_N*WV11.png \
    Z_*nwv01*_hsy_NA*.png \
    Z_*EDZW_*_htp_na_N_*_WV11SW.png \
    Z_*_rft_na_*.png \
    Z_*_r12* \
  destination

Se você quiser dividir isso (talvez porque você tenha "a linha de comando muito longa"), você pode usar um documento aqui.

while read files; do
    mv $files dest
done <<____
    Z_*ana_bwk_na_N*.png
    Z_*ana_bwk_dwda*.png
    Z_*ana_bwkman_dwdna*
    Z_*ana_bwkman_dwdc*
    Z_*EDZW*_nwv01*_p00_na_N*WV11.png
    Z_*EDZW*_nwv01*_p00_nh_N*WV11.png
    Z_*nwv01*_hsy_NA*.png
    Z_*EDZW_*_htp_na_N_*_WV11SW.png
    Z_*_rft_na_*.png
    Z_*_r12*
____

Se você deseja parametrizar o destino, também pode fazer isso.

while read destination files; do
    mv $files "$destination"
done <<____
    here       Z_*ana_bwk_na_N*.png
    here       Z_*ana_bwk_dwda*.png
    here       Z_*ana_bwkman_dwdna*
    there      Z_*ana_bwkman_dwdc*
    there      Z_*EDZW*_nwv01*_p00_na_N*WV11.png
    everywhere Z_*EDZW*_nwv01*_p00_nh_N*WV11.png
    here       Z_*nwv01*_hsy_NA*.png
    elsewhere  Z_*EDZW_*_htp_na_N_*_WV11SW.png
    there      Z_*_rft_na_*.png
    anywhere   Z_*_r12*
____

Um pouco confuso, os curingas no documento aqui serão expandidos pelo shell antes da execução do loop. Como precisamos que o loop interno não seja chamado, os nomes dos arquivos expandidos não podem conter metacaracteres do shell ( que não correspondem exatamente a si próprios - normalmente espaços em branco irregulares ou expressões curinga).

    
por 04.10.2017 / 14:26
0

É simples:

mv Z_*ana_bwk_na_N*.png Z_*ana_bwk_dwda*.png Z_*ana_bwkman_dwdna* -t /your/directory/

Se você quiser mais elegante com a entrada do arquivo:

PATTERNS='cat input.txt | paste -sd " " - ' && mv $PATTERNS -t /your/directory/
    
por 04.10.2017 / 14:21
0

assuma seus padrões em um arquivo chamado patterns

mapfile -t arr < patterns && mv -t destination "${arr[@]}"
    
por 05.04.2019 / 03:49