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 exatamente 2015
, 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 para find
.
Se houver algum arquivo diretamente contido no diretório atual (aquele em que você executou esse find ...
comando) cujos nomes contenham 2015
(e não inicie com a .
), o shell se expandiu *2015*
para uma lista desses nomes de arquivos e passou essa lista como argumentos para find
. Não é isso que você deseja - em vez disso, você deseja passar *2015*
literalmente como um argumento a ser encontrado, para que find
, 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*'
(ie find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;
)
"*2015*"
(ie find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
)
\*2015\*
(ie find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;
)
Eu sugiro escrevê-lo com aspas simples como '*2015*'
, porque:
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:
Numeric arguments can be specified as
+n for greater than n,
-n for less than n,
n for exactly n.
-mtime n
File's data was last modified n*24 hours ago. See the comments
for -atime to understand how rounding affects the interpretation
of file modification times.
-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has to
have been accessed at least two days ago.
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
:
find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;
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 por find
'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.
find . -name '*2015*' -mmin +1440 -ls
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:
find . -name '*2015*' -mmin +1440
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 ...)