Eu tenho uma conta de e-mail que já passou de 60 GB de e-mails e, atualmente, estou tendo muitos problemas ao usar um cliente de e-mail para arquivar e-mails do ano passado (2011).
Via terminal, estou tentando usar o find para localizar os arquivos entre 01-01-2011 e 31-12-2011, mas sem sucesso.
Como posso encontrar arquivos entre duas datas?
Se relevante, o objetivo final será um lote que moverá cada arquivo encontrado, correspondendo ao intervalo de datas, para uma pasta.
command-line
find
Zuul
fonte
fonte
Respostas:
Você pode usar este script:
fonte
find
não deve ser processada em umfor
loop de shell como este, exceto quando for garantido que nenhum arquivo tenha espaços em branco em seu nome.-exec
,,-execdir
ou-print0 | xargs
normalmente deve ser usado; outra solução possível, que geralmente é muito menos desejável, mas permite que umfor
loop seja usado, é configurada temporariamenteIFS
para que um espaço não seja reconhecido como um separador de campo.find
porexec
? Você se importaria de adicionar uma resposta que abordasse o uso de espaços .. ?? Muito apreciado.exec
comando. Use umfind
comando com a-exec
ação a ser executadamv
, ou o que você precisar executar, conforme descrito na resposta que eu publiquei . Quandofind
...-exec
executa seu comando com os nomes de caminho encontrados, ele não usa um shell, portanto, os espaços não acionam a divisão ou o globbing de palavras . (Você pode querer postar uma nova pergunta sobre o seu caso específico, ou para pedir exatamente o que você quer saber.)O Bash encontra arquivos entre duas datas:
Retorna uma lista de arquivos com registro de data e hora após 07/10/2010 e antes de 08/10/2014
O Bash encontra arquivos de 15 minutos atrás até agora:
Retorna uma lista de arquivos com registro de data e hora após 15 minutos atrás, mas antes de agora.
O Bash encontra arquivos entre dois registros de data e hora:
Retorna arquivos com timestamps entre
2014-10-08 10:17:00
e2014-10-08 10:53:00
fonte
Movendo os arquivos e solicitando ao usuário quando houver nomes duplicados:
Como mostram as respostas de Subv3rsion e Eric Leschinski , o
-newermt
predicado seleciona arquivos modificados mais recentemente que a data (e hora opcional) especificada como seu operando. Para encontrar arquivossrcdir
(incluindo seus subdiretórios, seus subdiretórios, etc.)destdir
...você pode correr:
Em uma
-exec
expressão, find passa o nome do arquivo encontrado no lugar de{}
.;
significa-exec
que o comando a ser executado e seus argumentos foram todos fornecidos (no caso de expressões subsequentes serem passadas para localizar-exec
os argumentos desse predicado em particular - veja abaixo um exemplo disso).;
deve ser escapado,\;
para que não seja interpretado especialmente pelo shell. (Sem\
,;
terminaria ofind
comando inteiro , funcionando da mesma forma que uma nova linha. Mesmo que essefind
comando não tenha nada após essa-exec
expressão, a falha em passar o;
argumento ainda é um erro de sintaxe.)Se você apenas deseja listar os arquivos - o que é aconselhável se você não tiver certeza de como os emails antigos são armazenados ou quais outros arquivos podem estar presentes - omita
-exec
e tudo à sua direita. (Para email, geralmente emails de datas diferentes são armazenados no mesmo arquivo; para alguém na situação descrita na pergunta aqui, recomendo investigar como eles são armazenados antes de mover qualquer arquivo.) Se você deseja imprimir os nomes e mover adicione-print
antes-exec
.mv -i
solicita sempre que um arquivo é substituído no destino, como aconteceria se:srcdir
já foi movido durante a mesmafind
operação, ousrcdir
durante a mesmafind
operação, depois que o original foi movido, mas logo foi encontrado uma vez quefind
percorre um subdiretório diferente.Outras maneiras de chamar
rm
:Você tem outras opções para lidar com arquivos com nomes duplicados.
-i
(ou seja ), normalmente não solicitaria aprovação, mas o faria se o arquivo de destino fosse somente leitura. ( pode até conseguir substituir um arquivo somente leitura às vezes, como se o usuário que o possui é o proprietário.)mv {} destdir/
mv
mv
mv
sempre deseja (tentar) substituir arquivos nomeados de forma idêntica, usemv -f
.mv -n
.mv
aceita os sinalizadores-b
e--backup
para renomear automaticamente arquivos nomeados de forma idêntica que já existem no destino. Por padrão,~
é adicionado para produzir o nome do backup e, se um arquivo com o nome e um arquivo com o nome do backup já existir no destino, o arquivo de backup será substituído. Esse padrão pode ser substituído por opções passadas ao chamarmv
e por variáveis de ambiente. Vejaman mv
para detalhes e o exemplo abaixo.Movendo os arquivos e criando backups em caso de nomes duplicados:
Para mover todos os arquivos, faça backup de arquivos com nomes duplicados usando um
~
sufixo e use sufixos numerados quando os arquivos já existirem (para evitar a substituição de qualquer coisa), execute:.~n~
.~
Se você pulou arquivos com nomes duplicados e deseja saber quais:
Se você usa
mv -n
e deseja saber quais arquivos não foram movidos porque havia outro arquivo com o mesmo nome, a melhor maneira é provavelmente apenas executar ofind
comando original novamente, sem-exec
e tudo à sua direita. Isso imprimirá seus nomes.Ele também imprimirá os nomes de todos os arquivos correspondentes criados desde que você executou o
find .... -exec ...
comando original , mas para este aplicativo normalmente não haverá nenhum, pois você está procurando arquivos com tempos de modificação antigos. É possível atribuir a um arquivo um carimbo de data / hora da modificação anterior à sua idade real, comtouch
e outros mecanismos, mas isso não parece provável que ocorra neste caso sem o seu conhecimento.Saber imediatamente como os arquivos são ignorados devido a nomes duplicados:
mv -n
não relata nem retorna nenhum código de saída especial quando evita mover um arquivo. Portanto, se você quiser ser informado imediatamente dos arquivos ignorados durante afind
execução, precisará fazer uma etapa separada para isso. Uma maneira é:Algumas considerações técnicas provavelmente menores: Isso avisa incorretamente se
mv
não conseguir copiar um arquivo por um motivo diferente do existente no destino e sair do relatório com êxito . Parece improvável, mas não tenho certeza de que seja impossível. Ele também potencialmente sofre uma condição de corrida : alertaria quando não houvesse nenhum erro real, se um novo arquivo com o mesmo nome fosse criado no mesmo local durante o período muito curto após a movimentação do arquivo antigo e antes da verificação para veja se foi removido. (Considerando o aplicativo, duvido que algum problema realmente ocorra.) Poderia ser reescrito para verificar o destino antesmovendo o arquivo em vez de depois: a condição de corrida se relacionaria aos arquivos de destino recém-criados, em vez dos arquivos de origem. E enquanto os erros e avisos relatados porfind
oumv
(ou[
, embora não deva haver) sejam gravados no erro padrão , nosso...skipped (exists in...
aviso é gravado na saída padrão . Normalmente, ambos aparecem no seu terminal, mas isso pode importar se você estiver usando scripts.Dividi esse comando em duas linhas para facilitar a leitura. Pode ser executado dessa maneira ou você pode remover
\
a linha e a nova linha (ou seja, a quebra de linha).Como esse
find
comando funciona?find
predicados podem ser testes (como-type
e-newermt
), usados para seus valores de retorno ou ações (como-print
e-exec
), que são frequentemente usados para seus efeitos colaterais.Quando nenhum operador (como
-a
for e ,-o
for ou ) é fornecido entre expressões,-a
é implícito.find
emprega avaliação de curto-circuito para e e ou . (ou seja, ) só é verdade se os p e q expressões são verdadeiras, então q não precisa ser avaliada se p é falsa. Embora muitas vezes não pensemos nisso nesses termos, é por isso que os testes precisam ser verdadeiros para ações ou testes subsequentes a serem avaliados. Por exemplo, suponha que se encontre um diretório. Ele é avaliado como falso, para que possa pular tudo depois.p q
p -a q
find
-type f
Como testes, as ações também são avaliadas como verdadeiras ou falsas. Dessa maneira,
-exec
relata se o comando executado saiu do relatório de sucesso (verdadeiro) ou falha (falso). Temos essa cadeia de-exec
expressões conectada com implícita e :Isso tenta mover o arquivo e, se
mv
relatar falha, para. Não queremos avisar sobre um arquivo ignorado corretamente se outro problema foi o motivo pelo qual não foi movido.Mas, se for bem-sucedido, ele executa o
[
comando . Comofind
,[
suporta seu próprio tipo de expressões passadas como argumentos.[ -f {} ]
verifica se o operando depois-f
(passado para elefind
no lugar de{}
) existe (e é um arquivo regular) e retorna verdadeiro / sucesso ou falso / falha.(O status de saída de muitos comandos é melhor interpretado como significando sucesso ou falha, mas
[
o status existente é geralmente melhor interpretado como verdadeiro ou falso.)Se
[
retornado falso, o arquivo se foi e, por isso, foi movido, não sendo necessário fazer nada. Mas se[
retornado falso, o arquivo ainda está lá. Em seguida,find
avalia a próxima-exec
expressão, que imprime a mensagem de aviso.Leitura adicional
man find
e o manual de referência do GNU Findutilsman mv
e o manual de referência do GNU Coreutils (especialmente 11.4mv
: Mover (renomear) arquivos )man \[
e 16.3 test: verifique os tipos de arquivo e compare os valores nos documentos do CoreutilsEste (ie
/usr/bin/[
), e não o shell[
interno , é o que éfind
executado quando você usa-exec [
.fonte
-exec ... +
commv -t
, em breve.