AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 766098
Accepted
symcbean
symcbean
Asked: 2024-01-04 19:22:09 +0800 CST2024-01-04 19:22:09 +0800 CST 2024-01-04 19:22:09 +0800 CST

Script Bash - verifique se algum arquivo foi alterado recentemente

  • 772

Estou escrevendo um script que precisa verificar se algum arquivo em um determinado diretório foi modificado recentemente. Achei que poderia simplesmente usar find, mas ele relata sucesso mesmo que não encontre uma correspondência:

$ touch afile
$ find . -mtime -1 -iname ????*
./afile
$ echo $?
0
$ find . -mtime +1 -iname ????*
$ echo $?
0

(Estou apenas usando o predicado iname para excluir '.' aqui - mas o mesmo comportamento com -type f)

Eu preferiria não ter que analisar a saída, lspois isso pode ser temperamental .

Usar test -n "$(find . -mtime -1 -iname ????*)"parece dar o resultado desejado, mas não me parece uma solução particularmente elegante.

Não preciso saber quais arquivos foram modificados - apenas se ALGUM tiver sido alterado recentemente (onde "recentemente" geralmente será de 1 dia).

Existe uma maneira melhor de fazer isso?

(pesquisando no Google, encontro muitas porcarias de SEO sobre como executar uma busca simples)

bash
  • 4 4 respostas
  • 90 Views

4 respostas

  • Voted
  1. Best Answer
    terdon
    2024-01-04T21:15:49+08:002024-01-04T21:15:49+08:00

    Sim, como você viu, você não pode usar o código de saída do find para algo assim. O código de saída é apenas sobre se o comando foi executado com sucesso ou não, não tem nada a ver com o fato de os arquivos terem sido encontrados ou não. Afinal, não encontrar nenhum arquivo não é um fracasso, é um sucesso: você obteve o resultado correto, nenhum arquivo. Isso é explicado em man find(a citação é do GNU find):

    ESTADO DE SAÍDA

    encontre saídas com status 0 se todos os arquivos forem processados ​​com sucesso, maior que 0 se ocorrerem erros. Esta é deliberadamente uma descrição muito ampla, mas se o valor de retorno for diferente de zero, você não deve confiar na exatidão dos resultados de find .

    Quando ocorre algum erro, o find pode parar imediatamente, sem concluir todas as ações especificadas. Por exemplo, alguns pontos de partida podem não ter sido examinados ou algumas invocações de programa pendentes para -exec ... {} + ou -execdir ... {} + podem não ter sido executadas.

    Você realmente poderia usar -n $(find ...), não vejo problema nisso. Como os nomes dos arquivos não podem conter NUL, não consigo pensar em um caso que possa quebrar isso. Se você quiser algo um pouco mais limpo, tente usar um array e depois testar se o número de elementos no array é maior que 0. Algo assim:

    $ findResults=( $(find . -mtime -1 -iname '????*' | head -n1) )
    $ [[ ${#findResults[@]} -gt 0 ]] && echo "Found files!" || echo "No files found!"
    Found files!
    
    $ findResults=( $(find . -mtime +1 -iname '????*' | head -n1) )
    $ [[ ${#findResults[@]} -gt 0 ]] && echo "Found files!" || echo "No files found!"
    No files found!
    

    Francamente, porém, não tenho certeza se isso é melhor do que o mais simples [[ -n $(find ...) ]] && echo found || echo nope.

    • 2
  2. Jim L.
    2024-01-05T04:41:10+08:002024-01-05T04:41:10+08:00

    mtreefoi projetado especificamente para esse tipo de coisa, como verificar se um diretório cheio de binários não foi substituído por código malicioso ou corrompido ou qualquer caso de uso em que você deseja verificar se um conjunto de arquivos está livre de alterações inesperadas (seja em dados ou metadados).

    Crie ( -c) um arquivo de referência my_dir.mtreedo seu diretório ( -p my_dir), incluindo o -K sha256resumo:

    $ sudo mtree -c -p my_dir -K sha256 > my_dir.mtree
    

    Na próxima vez que você quiser verificar se algum arquivo foi modificado, execute mtreenovamente fornecendo apenas a -popção de caminho e seu arquivo de especificação mtree:

    $ sudo mtree -p my_dir < my_dir.mtree
    

    Quaisquer arquivos diferentes serão listados.

    • 0
  3. Stéphane Chazelas
    2024-01-05T17:48:53+08:002024-01-05T17:48:53+08:00

    Com zsh,

    if ()(($#)) **/????*(NDY1m-1); then
      echo There are files or directories last modified within the last 24 hours
    fi
    
    • () {body} argsdefine e executa uma função anônima cujo corpo aqui é a (($#))expressão aritmética que retorna verdadeiro se $#(o número de argumentos) for diferente de zero
    • **/qualquer nível (incluindo 0) de diretórios, abreviação de extendedglob's (*/)#. Observe que .ele próprio não é considerado, você pode substituir **/por {.,**/}se quiser que seja considerado.
    • N: qualificador nullglob glob : não reclame se não houver correspondência e, em vez disso, passe uma lista vazia para a função anônima.
    • D: dotglob, não pule arquivos ocultos.
    • Y1: pare na primeira partida como uma otimização
    • m-1: última modificação no último dia (24 horas) como find's -mtime -1.

    Com set -o extendedglob, você pode usar ?(#c4,)em vez de ????*para corresponder arquivos com pelo menos 4 caracteres em seus nomes.

    • 0
  4. Stéphane Chazelas
    2024-01-05T18:01:15+08:002024-01-05T18:01:15+08:00
    if find . -name '????*' -mtime -1 | LC_ALL=C grep -q '^'; then
      echo There are files last modified within the last 24 hours
    fi
    

    Pode ser um pouco mais eficiente se houver um grande número de arquivos correspondentes, pois grep -qserá encerrado assim que ler uma linha de entrada, após o que findserá eliminado na próxima vez que gravar algo no canal.

    Como findirá armazenar em buffer sua saída quando ela for para um canal, ela não será eliminada assim que o primeiro arquivo for encontrado.

    Com GNU ou FreeBSD find, você pode fazer:

    if [ -n "$(find . -name '????*' -mtime -1 -print -quit)" ]...
    

    No NetBSD, o equivalente é com -exit. Com GNU find, você pode substituir -printpor -printf .uma pequena otimização.

    Você também pode fazer coisas como:

    if [ -n "$(
      find . -name '????*' -mtime -1 -exec sh -c 'echo .; kill -s PIPE "$PPID"' ';'
      )" ]...
    

    Onde findinvoca shpara gerar algo e matar seu pai.

    • 0

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve