Preciso mover arquivos com base em um ano. Eu usei o find
comando
find /media/WD/backup/osool/olddata/ -mtime +470 -exec ls -lrth {} \;|sort -k6
mas para que este comando seja executado com sucesso, preciso saber exatamente mtime
agora 470 é apenas um palpite. Significa que se eu puder dar o ano de 2012, ele me fornecerá arquivos relacionados apenas a 2012.
Então, eu preciso de conselhos sobre como
Encontre arquivos com base no ano, por exemplo, 2012 e mova-os para outro diretório.
OS release 5.2
FIND version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX
-exec ls ... \;
vez de-exec ... +
? O seu achado é velho demais para isso? Nesse caso,find ... -print0 | xargs -0 ls...
seria muito mais rápido.Respostas:
Você deseja usar a
-newermt
opção parafind
:para obter todos os arquivos com hora de modificação em 2012.
Se sua descoberta não suportar,
-newermt
você também pode fazer o seguinte para impedir o uso de cálculos de deslocamento:fonte
find
(eu tenho encontrar a versão 4.4.2)-exec ls
não faz nenhum sentido.fonte
-exec ls -l
faz mais sentido e ainda mais durante o teste.find
pode imprimir tudo o quels
pode. OK, com uma exceção: escapar / citar caracteres desagradáveis. Mas, em geral, a saída defind
pode ser classificada diretamente. Chamadas inúteis de ls não tornam a coisa toda mais rápida.-print
ou possivelmente-ls
) durante os testes. A vantagem de usar-exec ls {}
é que ele já executa algo externo para encontrar . Assim, quando você muda dels
paramv
, as alterações reais são mínimas.De acordo com a página do manual, o argumento para -mtime é o número de dias que você está procurando. Você pode usar
date +%j
para encontrar o número de dias desde 1º de janeiro do ano atual.fonte
-daystart
opção se deseja trabalhar-mtime
. Caso contrário, você terá problemas com os arquivos no início e no final do ano, seja qual for a sua forma, a menos que você execute exatamente à meia-noite. Você pode fazer o deslocamento com mais precisão do-mmin
que com-mtime
se puder encontrar facilmente o número de minutos desde o ano novo. Mas o mesmo problema existe com isso-mtime
, apenas com menos arquivos (aqueles em um minuto por volta da meia-noite de ano novo).find -mtime $("date -+%j")
provavelmente não dará ao OP o que ele está fazendo. Estou deixando para a posteridade, já que isso parece um possível ponto cego para as pessoas caírem.Você pode tentar usar uma combinação com os comandos
stat
e / oudate
como nas seguintes linhas:BSD / Mac OS X:
Linux:
Nos dois casos, a abordagem é usar o
date
comando para extrair o ano da última hora de modificação de cada arquivo e, em seguida, construir um caminho com este ano. O comandomkdir -p
criará esse caminho se ele ainda não existir. Claro que você pode usar outrasfind
opções para refinar sua pesquisa.fonte
Se você fizer isso no diretório de trabalho, poderá fazer isso:
Isso simplifica consideravelmente as coisas e não causa sobreposição. Mas também pressupõe que esses arquivos tenham mais de 6 meses e que
ls
imprimam o ano em vez da hora exata.Para arquivos com mais de 6 meses, basta substituí-lo por:
ou algo semelhante, dependendo do mês. Se você deseja criar uma lista de meses para a qual mover arquivos (ou se deseja criar uma lista por anos), faça o seguinte:
fonte