Como listar arquivos com mais de um dia com “2015” no nome do arquivo?

10

Eu quero listar todos os arquivos de log que não pertencem a hoje e apenas os arquivos que contêm 2015 em seus nomes.

Estes são os comandos que 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 assim, os arquivos estão lá. Algo está errado com esses comandos, e eu não estou entendendo o que. Qualquer ajuda seria apreciada.

    
por Ten-Coin 08.04.2015 / 03:11

3 respostas

18

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:

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
    
por Eliah Kagan 08.04.2015 / 05:33
2

Cite a expressão e sugiro que você cite os colchetes também

find . -name "2015" -mtime +1 -exec  ls -ltrh  '{}' \;

ou

find . -name "*2015*" -mtime +1 -exec  ls -ltrh  '{}' \;

você não precisa passar os arquivos encontrados para ls

find . -name "*2015*" -mtime +1
    
por Panther 08.04.2015 / 03:38
2

Em zsh , você pode usar qualificadores glob (este é um recurso zsh exclusivo, não disponível em outros shells como o bash).

ls -ltr *2015*(m+1)

Isso só lista arquivos no diretório atual; para percorrer diretórios recursivamente , use

ls -ltr **/*2015*(m+1)

Com find , -name 2015 só encontra arquivos cujo nome é exatamente 2015 . -name *2015* só funciona se não houver arquivos cujo nome contenha 2015 no diretório atual, porque o shell expande o padrão *2015* antes que find seja invocado. Você precisa citar o padrão:

find -name '*2015*' -mtime +1 …

Observe que find -mtime +1 e *(m+1) de zsh localizam arquivos com pelo menos 48 horas , e não arquivos mais antigos que hoje. O sinal de mais significa “estritamente mais do que” e o número de dias é arredondado para baixo. Para encontrar arquivos com pelo menos 24 horas, use -mtime +0 ou (m+0) .

Se você quiser encontrar arquivos que foram modificados pela última vez ontem ou antes , você pode usar find com o -newermt predicate :

find -name '*2015*' ! -newermt 'today 0:00' …

Não há uma maneira realmente conveniente de fazer esse teste no zsh.

    
por Gilles 08.04.2015 / 16:37