Copiando o arquivo modificado mais recente de vários diretórios

2

Eu tenho a estrutura de diretórios adc/asd/abc.20150918_150635.gz , adc/asd/abc.20150921_140748.gz .... (onde .gz nomes de arquivos contêm registros de data e hora de sua criação). Muitos outros diretórios semelhantes a asd estão presentes aqui, por exemplo. adc/gmf/abc.20150918_010738.gz , adc/ret/abc.20150921_140748.gz , todos contendo arquivos com data e hora.

Eu quero copiar o arquivo modificado mais recente de todos os diretórios (ou seja, de asd , gmf , ret etc) com um único comando :).

Eu tentei cp "adc/*/abc.* ." , mas ele copiará todos os arquivos. Eu quero copiar apenas o arquivo modificado mais recente (com comando único). Alguém pode me ajudar?

    
por sagar alias jacky 21.09.2015 / 13:56

2 respostas

1

Para localizar o arquivo simples mais recente (.) de cada diretório (/) , um método de duas passagens para primeiro localizar os diretórios, encontre o arquivo mais recente (por mtime ou (om[1]) ) em cada diretório sentido. Com o ZShell, isso seria algo parecido com:

% typeset -a latest
% cd $TMPDIR
% mkdir latest
% cd latest/
% mkdir a b c 
% touch {a,b,c}/blah; sleep 3; touch {a,b,c}/a\ newer\ file
% for d in *(/N); do latest+=( $d/*(.om[1]) ); done
% [[ $#latest -eq 0 ]] && print uh oh
% print -l $latest
a/a newer file
b/a newer file
c/a newer file
% 

Portanto, cp $latest destdir deve ser suficiente (assumindo que foram encontrados arquivos), a menos que por algum motivo inexplicável você tenha ativado a opção SH_WORD_SPLIT no ZSH, caso em que você precisará lidar com problemas de citação como outros conchas fazem.

    
por 21.09.2015 / 16:53
0
cp $(ls -1t */*/* | head -n 1) destdir

Isto está assumindo que a lista completa de arquivos se encaixa no espaço disponível da lista de argumentos (ou você obterá o erro "lista de argumentos muito longa").

ls -1t ordena seus argumentos na ordem do tempo de modificação (a mais nova primeiro, a opção -t ) e mostra um arquivo por linha (a opção -1 ). head -n 1 leva apenas a primeira linha.

Isso é substituído na linha de comando para que você fique com cp newestfile destdir .

    
por 21.09.2015 / 14:12