Encontre arquivos mais recentes que um dia e copie

12

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

Isto é 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', funcionará:

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

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

Eu também tentei variáveis ​​e para 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 ecoar $ files, apenas os arquivos necessários serão mostrados.

Como posso fazer isso funcionar?

mac1234
fonte
1
Ok, eu acho que ele está trabalhando usando:find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
mac1234
O rsync não seria a melhor ferramenta para esta tarefa em vez do cp? rsync - um destino de origem
Darryl

Respostas:

9

Algumas implementações de cptêm uma -topção, para que você possa colocar o diretório de destino antes dos arquivos:

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

Note que isso -aimplica, --preserveentão eu removi o último.

Glenn Jackman
fonte
3

Você pode usar paxpara isso como:

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

A linha de comando bit a bit:

  • -wr- quando paxsão entregues as opções de -writo e fim que -rele copia. Possivelmente também útil aqui. (mas não incluído no comando acima)

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

    • -Xpara restringir paxao mesmo dispositivo de origem e / ou sistema de arquivos.

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

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

  • -T- o -Tarquivo de opções ime seleciona para o arquivo alvo (ou simplesmente copiar quando usado com -wr) com base em sua /mODIFICAÇÃO ou inode /change (ou ambos) vezes. O padrão é o horário da modificação. De...

homem pax

  • ... As comparações de tempo usando os dois tempos de arquivo são úteis quando pax é usado para criar um arquivo incremental baseado em tempo (apenas os 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]

  • Onde ccestão os dois primeiros dígitos do ano (o século), yysão os últimos dois 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é o hora do dia (de 00 a 23), MMé o minuto (de 00 a 59) e SSsão os segundos (de 00 a 59). O campo minuto MMé obrigatório, enquanto os outros campos são opcionais e devem ser adicionados na seguinte ordem:

    HH, dd, mm, yy, cc

  • O SScampo pode ser adicionado independentemente dos outros campos. Os intervalos de tempo são relativos ao horário atual, então ...

    -T 1234/cm

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

  • É -Tpossível fornecer vários intervalos de tempo e verificar as paradas com a primeira correspondência.

... então o 11comando lá em cima no meu exemplo é relativo a hoje - é um a menos que a data de hoje - que é a décima segunda - e o resto é apenas um "$(date)"formato padrão seguido de 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 um comportamento não especificado para caminhos de destino relativos - e a primeira vez que tentei usá-lo pax, xingava baixinho por uma hora, confusa com todos os resultados estranhos até usar um caminho absoluto.

mikeserv
fonte
2

Obrigado a todos pela ajuda, consegui trabalhar usando 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!

mac1234
fonte
2

Eu estava fazendo exatamente a mesma funcionalidade, mas precisava preservar a estrutura da pasta. Portanto, o que eu fiz é um pouco diferente.

cd sourcedir
find . -type f -mtime -$days -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

onde $ days é o número de dias em que $ tarpath é um caminho temporário para armazenar esses arquivos. e quando eu queria restaurar.

cd $destdir
tar -xvzf ${tarpath}/testtar.tar.gz

Isso fez o truque para mim.

Nota: se você deseja excluir alguma pasta enquanto faz o backup, pode usar o seguinte comando

find . -type f -mtime -$days ! -path '*/FolderToavoidSearch/*' -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

Vantagem: 1. Sempre tive uma cópia do que restaurei da última vez em formato compactado.

  1. também tenho uma pausa entre a restauração, onde posso ir e verificar o que são esses arquivos e, se estiver tudo bem, prossiga com o script.

  2. Ele preserva a estrutura da pasta, portanto, apenas substituiu os arquivos modificados do diretório de origem no diretório de destino

Nota: Por outro lado, se o requisito não for limitado por dia, eu usaria o rsync

rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/

mais para rsyc com data aqui

Amol Patil
fonte
1

Pode-se também selecionar a data e a hora exata, além de retornar a uma determinada quantidade de dias

(Isso funciona bem apenas no caso de os nomes dos arquivos não terem espaço, tab ou 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 20:10:00 para a PASTA (1 dia antes de hoje :)

Cuidado com o símbolo do comando find, NÃO é este: 'é isso, um backtick: `a seleção da data é com isso:'

Para arquivos com espaços, guias, novas linhas ou curingas em seus nomes, você pode usar qualquer uma das soluções de Stéphane Chazelas, a primeira é para o GNU, a segunda é para o 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 {} +
FatihSarigol
fonte
Obrigado, Stephane, talvez seja por isso que não consegui encontrar isso em nenhum post, embora para o meu caso tenha funcionado como um encanto. quando você faz isso apenas encontra. -type f -newermt '17 dez 2016 20:10:00 '
FatihSarigol
... imprime os arquivos criados após esse período, não tenho certeza de que tipo de problema ele possa causar. então eu apenas uso backticks para selecionar esses arquivos a serem copiados. Cheers
FatihSarigol
Acredito que a postagem que você compartilhou é sobre "Looping over", o meu código está repetindo o resultado da pesquisa? ou está apenas selecionando o resultado da pesquisa a ser usado por cópia? (Desculpe por 3 comentários, aparentemente ainda não tenho permissão para editar meus comentários
FatihSarigol
1
Use find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +(GNU) ou find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +(GNU ou alguns BSDs (o fator limitante da portabilidade do wrt é o -newermtpredicado aqui)).
Stéphane Chazelas