Encontre arquivos mais novos que um dia e copie

9

Estou trabalhando em um script que copiará APENAS arquivos que foram criados no último dia de folga para outra pasta. O problema que estou tendo é o script que eu tenho cópias de todos os arquivos no diretório de origem, em vez de apenas os arquivos com menos de um dia.

Isso é o que eu tenho:

find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \;

O código acima copia todos os arquivos no diretório de origem. Se eu remover todos os argumentos para 'cp', então funciona:

find . -mtime -1 -exec cp "{}" /somefolder \;

O código acima copia apenas os arquivos mais novos que eu quero, mas eu preciso preservar os atributos usando os argumentos cp.

Eu também tentei variáveis e loops pensando que talvez a opção -exec fosse o problema:

files="$(find -mtime -1)"
for file in "$files"
do
cp --parents --preserve -a file /somefolder

No entanto, o loop for acima resulta no mesmo problema, todos os arquivos são copiados. Se eu fizer o eco de $ files apenas os arquivos que eu preciso serão mostrados.

Como posso fazer isso funcionar?

    
por mac1234 12.12.2014 / 16:46

4 respostas

6

Algumas implementações de cp têm uma opção -t , então você pode colocar o diretório de destino antes dos arquivos:

find . -mtime -1 -exec cp -a --parents -t /somefolder "{}" \+

Observe que -a implica --preserve , então eu removi o último.

    
por 12.12.2014 / 17:12
3

Você pode usar pax para isso, como:

pax -wrT "11$(date +%H%M)," . /destination/folder

A linha de comando, bit por bit:

  • -wr - quando pax recebe as opções -w rite e -r ead que copia. Possivelmente também útil aqui. (mas não incluído no comando acima)

    • -l ink - que cria links físicos, se possível, em vez de copiar os dados do arquivo.

    • -X para restringir pax ao mesmo dispositivo de origem e / ou sistema de arquivos.

    • -s/src regex/replace/ - que modifica os nomes de arquivos in-stream

    • -v erbose - para gerar relatórios sobre arquivos originados / segmentados.

  • -T - a opção -T ime seleciona arquivos para o arquivo de destino (ou apenas para copiar quando usado com -wr ) com base em /m odification ou inode /c hange (ou ambos) vezes. O padrão é o tempo de modificação. De ...

homem pax

  • ... As comparações de tempo usando os dois tempos de arquivo são úteis quando o pax é usado para criar um arquivamento incremental baseado em tempo (somente arquivos que foram alterados durante um intervalo de tempo especificado serão arquivados).

  • Um intervalo de tempo é composto por seis campos diferentes e cada campo deve conter dois dígitos. O formato é:

    [[[[[cc]yy]mm]dd]HH]MM[.SS]

  • Em que cc são os dois primeiros dígitos do ano (o século), yy são os dois últimos dígitos do ano, o primeiro mm é o mês (de 01 a 12), dd é o dia do mês (de 01 a 31), HH é a hora do dia (de 00 a 23), MM é o minuto (de 00 a 59) e SS são os segundos ( de 00 a 59). O campo de minuto MM é obrigatório, enquanto os outros campos são opcionais e devem ser adicionados na seguinte ordem:

    HH, dd, mm, yy, cc

  • O campo SS pode ser adicionado independentemente dos outros campos. Os intervalos de tempo são relativos à hora atual, então ...

    -T 1234/cm

  • ... selecionaria todos os arquivos com uma modificação ou tempo de alteração de inode de 12:34 PM hoje ou mais tarde.

  • Múltiplos intervalos de tempo -T podem ser fornecidos e a verificação é interrompida com a primeira correspondência.

... então o 11 acima no meu comando de exemplo é relativo a hoje - é um a menos que a data de hoje - que é o décimo segundo - e o restante é apenas um formato "$(date)" padrão seguido por uma vírgula .

... exceto - e a última coisa que vale a pena mencionar - eu uso um caminho absoluto para o diretório de destino - e você também deve fazê-lo. Todos os documentos referenciam comportamento não especificado para caminhos de destino relativos - e a primeira vez que tentei usar pax , fiquei xingando por uma hora em confusão com todos os resultados esquisitos até usar um caminho absoluto.

    
por 12.12.2014 / 18:46
1

Agradeça a todos pela ajuda, trabalhe com uma combinação de suas sugestões:

foi com o código abaixo e funciona perfeitamente.

find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;

obrigado novamente!

    
por 12.12.2014 / 18:45
1

Também é possível selecionar a data e a hora exatas, além de voltar para uma determinada quantidade de dias

(Isso funciona bem apenas no caso de seus nomes de arquivo não possuírem espaço, tabulação ou caractere curinga)

cp 'find . -type f -newermt '17 dec 2016 20:10:00'' FOLDER

Acima copia todos os arquivos no diretório que foram criados após 17 de dezembro de 2016 às 20:10:00 para o FOLDER (1 dia antes de hoje:)

Tenha cuidado com o símbolo do comando find, NÃO é este:     'é isso, um backtick:     'seleção de data é com isto:'

Para arquivos com espaços, tabulações, novas linhas ou curingas em seus nomes, você pode usar qualquer uma das soluções de Stéphane Chazelas, a primeira é para GNU, a segunda é para GNU ou alguns BSDs:

find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} + 
find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +
    
por 18.12.2016 / 21:10