Quero listar todos os arquivos de log que não pertencem hoje e apenas os arquivos que contêm 2015
seus nomes.
Estes são os comandos que eu tentei:
find . -name 2015 -mtime +1 -exec ls -ltrh {} \;
find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
A saída de ambos não é nada, mas ainda existem arquivos. Algo está errado com esses comandos, e eu não estou entendendo o quê. Qualquer ajuda seria apreciada.
command-line
find
rɑːdʒɑ
fonte
fonte
find
parte parece boa para mim, mas também tive problemas com o-exec
parâmetro. Também não consegui fazer isso funcionar. (Eu estava tentando mover todos os arquivos JPG de uma pasta para seu diretório pai por ele - e acabou por fazê-lo manualmente ...)2015
o nome deles (a outra falha óbvia na maneira como o comando é escrito), suspeito que haveria algum tipo de saída. Então, você pode postar uma resposta sobre isso.Respostas:
O comando
find . -name '*2015*' -mmin +1440 -ls
provavelmente fará o que você deseja. Veja abaixo para detalhes.Seu primeiro comando teve
-name 2015
. Não funcionou porque encontra apenas arquivos cujos nomes são exatamente2015
, sem outros caracteres.Seu segundo comando,,
find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
pode ter falhado por alguns motivos:1.
*
Caracteres não citados são expandidos pelo shell e depois transmitidos parafind
.Se houver algum arquivo diretamente contido no diretório atual (aquele em que você executou esse
find ...
comando) cujos nomes contenham2015
(e não inicie com a.
), o shell se expandiu*2015*
para uma lista desses nomes de arquivos e passou essa lista como argumentos parafind
. Não é isso que você deseja - em vez disso, você deseja passar*2015*
literalmente como um argumento a ser encontrado, para quefind
, e não o shell, encontre quais arquivos correspondem a ele.Para corrigir esse problema, cite
*2015*
. Existem três maneiras comuns de fazer isso:'*2015*'
(iefind . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;
)"*2015*"
(iefind . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
)\*2015\*
(iefind . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;
)Eu sugiro escrevê-lo com aspas simples como
'*2015*'
, porque:\
pode dificultar a visualização exata do que está sendo passado pelo shell para ofind
comando."
algumas vezes envolve regras um pouco complicadas .Mas, neste caso, isso realmente não importa.
'
e"
ambos tratam*
o mesmo e a expressão não é complicada o suficiente para\
citar para dificultar a compreensão.2.
-mtime +1
seleciona apenas arquivos modificados há dois ou mais dias.Como
man find
diz:Suponha que um arquivo foi modificado 47 horas atrás. Para descobrir quantos períodos de 24 horas são
find
arredondados para baixo : é um período de 24 horas atrás. Mas-mtime +1
corresponde apenas a arquivos cujos horários de modificação são estritamente mais de um período de 24 horas atrás. Assim, os arquivos de ontem não são correspondidos.Consulte Por que encontrar -mtime +1 retorna apenas arquivos com mais de 2 dias? para obter mais informações, conforme sugerido pela steeldriver .
Para encontrar os arquivos modificados pela última vez a qualquer hora, mais de 24 horas atrás , sugiro estipulá-lo como 1440 minutos atrás com
-mmin +1440
:Alguns leitores podem estar se perguntando por que não citei
{}
. Algumas pessoas citam{}
para lembrar aos seres humanos que não é uma expressão para a expansão da cinta . As conchas no estilo Bourne (como o bash ) não exigem{}
nada dentro para serem citadas. Talvez algum shell que não seja do estilo Bourne o trate especialmente; pode ser por isso que alguns usuários o citam. Mas há também um equívoco que às vezes é necessário citar,{}
para que os-exec
nomes de arquivos sejam tratados com espaços corretamente. Falsa s; que: com{}
ou'{}'
,find
recebe os mesmos argumentos, como o shell remove as aspas antes de passar'{}'
parafind
. Para combater esse equívoco, não cito{}
, mas é uma questão de estilo - se você preferir{}
documentar como o shell não está tratando{
e}
, especialmente, tudo bem.Eu recomendo que você também quer mudar o seu
ls
comando, ou (como Muru sugeriu ) substituí-la porfind
's-ls
ação.ls -ltrh
provavelmente não está fazendo o que você pretende, porque é executado separadamente para cada arquivo encontrado e, portanto, os sinalizadores-t
e-r
, que especificam a classificação, são irrelevantes.Embora a saída seja formatada um pouco diferente do que com
ls -l
, o uso-ls
é mais simples e fácil.Ou, se você decidir que realmente precisa apenas listar os nomes dos arquivos (incluindo seus caminhos, em relação a
.
), basta especificar nenhuma ação, fazendo com que a-print
ação padrão seja usada:fonte
newerXY
sintaxe, que aceita argumentos de calendário, por exemplo,-newermt 'yesterday'
e! -newermt 'yesterday'
Cite a expressão e sugiro que você cite os colchetes também
ou
você não precisa passar os arquivos encontrados para ls
fonte
-type f
? E sels
tiver que ser usado, sugira usar-ls
.No zsh , você pode usar qualificadores glob (esse é um recurso exclusivo do zsh, não disponível em outros shells, como o bash).
Isso lista apenas os arquivos no diretório atual; para percorrer diretórios recursivamente , use
Com
find
,-name 2015
localiza apenas arquivos cujo nome é exatamente2015
.-name *2015*
só funciona se não houver arquivos cujo nome contenha2015
no diretório atual, porque o shell expande o padrão*2015*
antes defind
ser chamado. Você precisa citar o padrão:Observe que ambos
find -mtime +1
e o zsh*(m+1)
encontram arquivos com pelo menos 48 horas de duração , e não arquivos mais antigos que hoje. O sinal de mais significa "estritamente mais que" e o número de dias é arredondado para baixo. Para encontrar arquivos com pelo menos 24 horas de duração, use-mtime +0
ou(m+0)
.Se você deseja encontrar arquivos que foram modificados pela última vez ontem ou antes , você pode usar
find
com o-newermt
predicado :Não existe uma maneira realmente conveniente de fazer esse teste no zsh.
fonte