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 ele encontra apenas arquivos cujos nomes são exatamente 2015
, sem outros caracteres neles.
Seu segundo comando, find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
, pode ter falhado por alguns motivos:
1. Caracteres *
sem aspas são expandidos pelo shell, então passados para find
.
Se houver arquivos diretamente contidos no diretório atual (aquele em que você está quando executou o comando find ...
) cujos nomes contêm 2015
(e não comece com um .
), então o shell expandiu *2015*
em uma lista desses nomes de arquivos, então passou essa lista como argumentos para find
. Isto não é o que você quer - em vez disso, você quer passar *2015*
literalmente como um argumento para encontrar, de forma que find
, e não o shell, possa encontrar quais arquivos combinam com ele.
Para corrigir esse problema, cite *2015*
. Existem três maneiras comuns de fazer isso:
-
'*2015*'
(ou seja,find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;
) -
"*2015*"
(ou seja,find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
) -
\*2015\*
(ou seja,find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;
)
Sugiro que o escreva com aspas simples como '*2015*'
, porque:
-
Citar caracteres individuais com
\
pode tornar difícil ver exatamente o que é sendo passado pelo shell para o comandofind
. -
As citações com
"
às vezes envolvem algumas regras complicadas .
Mas neste caso, isso realmente não importa. '
e "
tratam *
da mesma forma e a expressão não é complicada o suficiente para \
para dificultar a compreensão.
2. -mtime +1
apenas seleciona arquivos modificados dois ou mais dias atrás.
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 há 47 horas. Para descobrir quantos períodos de 24 horas, find
arredonda para baixo : é um período de 24 horas atrás. Mas -mtime +1
corresponde apenas a arquivos cujos tempos de modificação são estritamente superiores a um período de 24 horas atrás. Assim, arquivos de ontem não são correspondidos.
Veja Por que encontrar -mtime +1 somente retornar arquivos com mais de 2 dias? para obter mais informações, como sugerido pela steeldriver .
Para encontrar arquivos modificados pela última vez há mais de 24 horas , sugiro estipular como 1440 minutos atrás com -mmin +1440
:
find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;
Alguns leitores podem estar se perguntando por que eu não citei {}
. Algumas pessoas citam {}
para lembrar os humanos que não é uma expressão para expansão de chaves . Cascas ao estilo Bourne (como bash ) não requer {}
sem nada dentro para ser citado. Talvez algum shell não Bourne o trate especialmente; pode ser por isso que alguns usuários o citam. Mas há também um equívoco de que às vezes é preciso citar {}
então -exec
manipula nomes de arquivos com espaços corretamente. Isso é falso: com {}
ou '{}'
, find
obtém os argumentos mesmos , como o shell remove as aspas antes de passar '{}'
para find
. Para combater esse equívoco, não cito {}
, mas é uma questão de estilo - se você preferir {}
para documentar como o shell não está tratando {
e }
especialmente, tudo bem. / sup>
Também recomendamos que você altere seu comando ls
ou (como muru sugeriu ) substitua-o pela ação find
-ls
. 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 de forma um pouco diferente do que com ls -l
, usar -ls
é mais simples e fácil.
find . -name '*2015*' -mmin +1440 -ls
Ou se você decidir que realmente só precisa listar os nomes dos arquivos (incluindo seus caminhos, relativos a .
), você pode simplesmente especificar nenhuma ação, fazendo com que a ação -print
padrão seja usada:
find . -name '*2015*' -mmin +1440