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?
fonte
find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
Respostas:
Algumas implementações de
cp
têm uma-t
opção, para que você possa colocar o diretório de destino antes dos arquivos:Note que isso
-a
implica,--preserve
então eu removi o último.fonte
Você pode usar
pax
para isso como:A linha de comando bit a bit:
-wr
- quandopax
são entregues as opções de-w
rito e fim que-r
ele copia. Possivelmente também útil aqui. (mas não incluído no comando acima)-l
tinta - que cria links físicos, se possível, em vez de copiar os dados do arquivo.-X
para restringirpax
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
- o-T
arquivo de opções ime seleciona para o arquivo alvo (ou simplesmente copiar quando usado com-wr
) com base em sua/m
ODIFICAÇÃO ou inode/c
hange (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
cc
estão os dois primeiros dígitos do ano (o século),yy
são os últimos dois dígitos do ano, o primeiromm
é 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) eSS
são os segundos (de 00 a 59). O campo minutoMM
é obrigatório, enquanto os outros campos são opcionais e devem ser adicionados na seguinte ordem:HH, dd, mm, yy, cc
O
SS
campo 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.
É
-T
possível fornecer vários intervalos de tempo e verificar as paradas com a primeira correspondência.... então o
11
comando 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.fonte
Obrigado a todos pela ajuda, consegui trabalhar usando uma combinação de suas sugestões:
foi com o código abaixo e funciona perfeitamente.
obrigado novamente!
fonte
Eu estava fazendo exatamente a mesma funcionalidade, mas precisava preservar a estrutura da pasta. Portanto, o que eu fiz é um pouco diferente.
onde $ days é o número de dias em que $ tarpath é um caminho temporário para armazenar esses arquivos. e quando eu queria restaurar.
Isso fez o truque para mim.
Nota: se você deseja excluir alguma pasta enquanto faz o backup, pode usar o seguinte comando
Vantagem: 1. Sempre tive uma cópia do que restaurei da última vez em formato compactado.
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.
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
mais para rsyc com data aqui
fonte
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)
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:
fonte
find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +
(GNU) oufind . -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-newermt
predicado aqui)).