Categories
por

Como executar uma tarefa quando um novo ficheiro é adicionado a um directório no linux

Existe um directório A cujo conteúdo é alterado frequentemente por outras pessoas.

Fiz um directório pessoal B onde guardo todos os ficheiros que já estiveram em A .

Actualmente, só ocasionalmente faço rsync para que os ficheiros sejam copiados de A para B . Contudo, receio a possibilidade de alguns ficheiros serem adicionados em A , e depois removidos de A antes de ter a oportunidade de os copiar para B .

Qual é a melhor maneira de evitar que isto ocorra? Idealmente, gostaria que o meu guião de cópia de segurança actual fosse executado sempre que o conteúdo de A fosse alterado.

4 Respostas 4

Se tiver inotify-tools instaladas, pode utilizar o inotifywait para desencadear uma acção se um ficheiro ou directório for escrito:

Onde o interrupto r-qq é completamente silencioso, – r é recursivo (se necessário) e-e é o evento a monitorizar, neste caso modificar . De man inotifywait :

modificar Um ficheiro vigiado ou um ficheiro dentro de um directório vigiado foi escrito.

Tente introduzir uma ferramenta de linha de comando que pode executar comandos arbitrários quando os ficheiros mudam. Desde o lançamento do 2.9, foi adicionada uma opção de observação de directório ( – d ) para reagir a eventos quando um novo ficheiro é adicionado a um directório.

Exemplo para executar o utilitário se um novo ficheiro for adicionado ao projecto:

No modo de vigilância de directórios, o directório principal de cada ficheiro é implicitamente adicionado à lista de vigilância.

A única implicação disto é que se um novo ficheiro aparecer tem de sair para permitir que um laço de shell externo possa voltar a digitalizar o sistema de ficheiros.

Aqui está a versão sem opção de observação de directório:

Aqui está um exemplo mais simples, dependendo das suas necessidades:

Como posso detectar imediatamente quando novos ficheiros são adicionados a uma pasta dentro de um script bash? Gostaria que o script processasse ficheiros assim que estes são criados na pasta. Há algum método para além do agendamento de um cron job que verifique a existência de novos ficheiros a cada minuto ou assim?

12 Respostas 12

Deve considerar a utilização do inotifywait , como um exemplo:

Em Ubuntu inotifywait é fornecido pelo pacote inotify-tools. A partir da versão 3.13 (actual em Ubuntu 12.04) a inotifywait incluirá o nome do ficheiro sem a opçã o-f. As versões mais antigas podem precisar de ser coagidas. O que é importante notar é que a opçã o-e de inotifywait é a melhor maneira de fazer filtragem de eventos. Além disso, o seu comando de leitura pode atribuir a saída posicional em múltiplas variáveis que pode optar por utilizar ou ignorar. Não há necessidade de usar grep/sed/awk para pré-processar a saída.

No caso de ter vindo aqui para uma solução simples, rápida e prática de leitura do título, poderá usar o relógio

Monitora a sua pasta e lista tudo o que nela se encontra a cada 0,1 segundos

Drawback

Não Roteável (Para opções de scripting, veja outras respostas)

Não em tempo real, portanto, se um ficheiro fosse criado e apagado em menos de 0,1 segundos, então isto não funcionaria, o relógio apenas suporta um mínimo de 0,1 segundos.

Acabei de cozinhar isto, e não vejo nenhum grande problema com isto, a não ser uma pequena hipótese de faltar ficheiros entre as verificações.

Se o seu ficheiro pr

A utilização da entrada é a nova forma de o fazer (é a plataforma cruzada). A nota de entrada não utiliza sondagens, o que lhe confere uma enorme vantagem sobre muitas das alternativas.

Utiliza kqueue(2) ou inotify(7) para evitar sondagens. entr foi escrito para tornar o feedback rápido e os testes automatizados naturais e completamente ordinários.

No BSD utiliza pledge(2)

Pode instalá-lo com

Pode seguir um directório para novas adições usando

Opções explicadas (a partir dos documentos),

-d Acompanhar os directórios de ficheiros regulares fornecidos como entrada e saída se um novo ficheiro for adicionado. Esta opção também permite especificar explicitamente os directórios. Ficheiros com nomes que comecem por ‘.’ são ignorados.

  • -n Executar em modo não-interactivo. Neste modo de entrada não tenta ler a partir do TTY ou alterar as suas propriedades.
  • -r Recarregar um processo infantil persistente. Tal como no modo normal de funcionamento, um utilitário que termina não é executado novamente até que um sistema de ficheiros ou evento de teclado seja processado. O SIGTERM é utilizado para terminar o utilitário antes de este ser reiniciado. É criado um grupo de processos para impedir que os scripts de shell mascaram os sinais. entram espera que o utilitário saia para garantir que recursos como as tomadas foram fechados. O controlo do TTY não é transferido o processo de criança.
  • A entrada de notas não é aí sondada. É depois de haver uma operação sobre um inode que não tenha visto. Note-se que isto não é um mecanismo à prova de falhas porque o inode poderia ser inteiramente reciclado para um nome de ficheiro diferente. Ie,

Ver a resposta inotifywait para um método melhor, e mais poderoso, de o fazer. Embora com uma interface muito pior.

Presumo que a pasta de destino (chamo-lhe “isempty” só por conveniência) esteja vazia e que se esteja à espera que um ou mais ficheiros sejam lá largados.

Pode usar o seguinte comando:

apenas para verificar se a pasta ainda está vazia, de facto devolverá um 0 se não houver um novo ficheiro (daí que a pasta isempty ainda esteja vazia) ou, por outro lado, devolverá um valor superior a 0 (na verdade, o número de ficheiros actualmente na pasta).

Dito isto, um teste tolo de se/então pode fazer o resto do trabalho:

É claro que a função do_something terá de manipular o(s) ficheiro(s) dentro da pasta isempty e depois removê-lo(s) da própria pasta após o processamento.

Adicionar uma linha como a seguinte na sua crontab irá executar a verificação uma vez por minuto e desencadeará a acção do_something se a pasta não estiver vazia, claro:

Se quiser detectar novos ficheiros, então processe-os e no final apague os ficheiros processados, pode utilizar systemd. path. Este método baseia-se em inotify. Existe uma opção DirectoryNotEmpty, para que o systemd possa executar o seu script sempre que detectar quaisquer ficheiros no directório. Tem de se lembrar que só funcionará se conseguir apagar os ficheiros processados e o script deixa o directório vazio.

Primeiro prepare o ficheiro mymonitor. service

em seguida ir para mymonitor. path para definir o caminho

Se o nome do ficheiro. path for o mesmo que o nome do serviço, não há necessidade de especificar o nome do serviço no ficheiro. path.

Depois de procurar as respostas aqui e as da outra pergunta mencionada como possível duplicata nos comentários acima, penso que iria com o fswatch, uma vez que tem suporte de cross-plataforma.

Utiliza diferentes tipos de monitores para diferentes SO e pode escolher o apropriado automaticamente, ou permitir que se especifique qual utilizar e até passar parâmetros específicos de plataforma personalizados para o respectivo monitor.

A lista de monitores que suporta actualmente é:

Um monitor baseado no File System Events API do Apple OS X.

  • Um monitor baseado em kqueue, uma interface de notificação de eventos introduzida no FreeBSD 4.1 e suportada na maioria dos sistemas *BSD (incluindo OS X).
  • Um monitor baseado em inotify, um subsistema de kernel Linux que reporta alterações do sistema de ficheiros a aplicações.
  • Um monitor baseado em File Events Notification, uma API do kernel Solaris/Illumos que reporta eventos de ficheiros.
  • Um monitor baseado em ReadDirectoryChangesW, uma API do Microsoft Windows que reporta alterações a um directório.
  • Um monitor que periodicamente faz a estatística do sistema de ficheiros, guarda os tempos de modificação dos ficheiros na memória e calcula manualmente as alterações do sistema de ficheiros, que pode funcionar em qualquer sistema operativo onde o stat (2) possa ser utilizado.
  • Parece estar disponível via apt-get em Debian/Ubuntu Linuxes. Veja como instalar via apt-get e utilizar o fswatch.

Pode também compilá-lo e instalá-lo noutros SOs, encontrou um artigo+video mostrando como fazer e instalar o fswatch no CentOS.

Há também um outro artigo que mostra o mesmo processo manual de construção/instalação (e utilização) do fswatch para Linux.

O suporte de instalação baseado no Windows parece ainda não estar disponível (por exemplo, ainda não existe nenhum pacote para Chocolatey, e nenhum pacote para Vcpkg).

Leia sobre a utilização do fswatch aqui, aqui e aqui e uma introdução tutorial aqui

Uma biblioteca chamada libfswatch é mantida em sincronia com a ferramenta fswatch. Ver aqui e um documento mais recente aqui. Note-se que a biblioteca tem uma versão diferente da do próprio utilitário fswatch. Especificamente, o doc da biblioteca 1.14.0 declara:

“O esquema de versões da libtool é descrito por três números inteiros: actual:revisão:idade.

current é o número de interface mais recente implementado pela biblioteca.

  • revision é o número de implementação da interface actual.
  • age é a diferença entre a interface mais recente e a mais antiga que a biblioteca implementa.
  • Cuidado que há também outro s/w semelhante chamado fswatch (que está relacionado com o go-relacionado, penso eu).

Existe um directório A cujo conteúdo é alterado frequentemente por outras pessoas.

Existe um directório A cujo conteúdo é alterado frequentemente por outras pessoas.

Fiz um directório pessoal B onde guardo todos os ficheiros que já estiveram em A .

Actualmente, só ocasionalmente faço rsync para que os ficheiros sejam copiados de A para B . Contudo, receio a possibilidade de alguns ficheiros serem adicionados em A , e depois removidos de A antes de ter a oportunidade de os copiar para B .

Qual é a melhor maneira de evitar que isto ocorra? Idealmente, gostaria que o meu guião de cópia de segurança actual fosse executado sempre que o conteúdo de A fosse alterado.

4 Respostas 4

Se tiver inotify-tools instaladas, pode utilizar o inotifywait para desencadear uma acção se um ficheiro ou directório for escrito:

Onde o interrupto r-qq é completamente silencioso, – r é recursivo (se necessário) e-e é o evento a monitorizar, neste caso modificar . De man inotifywait :

modificar Um ficheiro vigiado ou um ficheiro dentro de um directório vigiado foi escrito.

Tente introduzir uma ferramenta de linha de comando que pode executar comandos arbitrários quando os ficheiros mudam. Desde o lançamento do 2.9, foi adicionada uma opção de observação de directório ( – d ) para reagir a eventos quando um novo ficheiro é adicionado a um directório.

Exemplo para executar o utilitário se um novo ficheiro for adicionado ao projecto:

No modo de vigilância de directórios, o directório principal de cada ficheiro é implicitamente adicionado à lista de vigilância.

A única implicação disto é que se um novo ficheiro aparecer tem de sair para permitir que um laço de shell externo possa voltar a digitalizar o sistema de ficheiros.

Aqui está a versão sem opção de observação de directório:

Aqui está um exemplo mais simples, dependendo das suas necessidades:

Este tutorial irá mostrar-lhe como utilizar eventos do sistema de ficheiros Linux (notificar) para ser notificado sempre que um ficheiro aparece num directório. Poderá utilizá-los como gatilhos para automatizar tarefas comuns no seu sistema.

Vamos escrever um script que observa um directório e actua sobre novos ficheiros que são adicionados. Cada ficheiro é gzipado e movido para outro directório, assim que for detectado. O guião utiliza o subsistema inotify, através de um utilitário chamado inotify-tools. Mas primeiro, vamos instalar a ferramenta e experimentar.

Instalação de inotify-tools e gzip

Use apt-get para instalar este pacote no seu sistema se estiver a usar Ubuntu ou outra distribuição baseada em Debian. Em outras distribuições Linux, utilize antes a ferramenta de gestão de pacotes da sua distribuição Linux.

Experimentar as ferramentas inotify

Comecemos por observar um directório e ver que eventos se iniciam quando chegam novos ficheiros. Utilizaremos uma ferramenta chamada inotifywatch , que faz parte das inotify-tools. Criar uma nova directoria chamada “incoming”:

Comece por observar este directório executando o seguinte comando:

Isto instruirá a inotify para assistir a todos os eventos do sistema de ficheiros no directório “incoming”. A opçã o-v faz com que a ferramenta imprima informação extra sobre o que está a fazer. Não especificámos uma opção timeout (-t ), e o comando continuará a reunir eventos até sairmos com CTRL+C. Neste momento, o nosso terminal deve ter o aspecto seguinte:

Abrir uma nova janela de terminal (ou separador) e mudar para o directório de entrada. Use o comando touch para criar um novo ficheiro chamado “newfile”.

Agora volte à primeira janela de terminal e pare o inotifywatch, premindo CTRL+C.

Uma tabela de eventos será servida à consola, indicando uma instância de “criar”, “abrir”, “attrib” e “fechar_escrever”. Estes quatro eventos ocorreram quando utilizámos o toque para criar um novo ficheiro, definimos os seus atributos de acesso ao ficheiro, abrimo-lo para escrever um carácter de terminação nulo, e depois fechámo-lo. Estes são apenas alguns dos muitos eventos que podem ser monitorizados num sistema de ficheiros com ferramentas de inotificação. Pode ver a lista completa na página principal para inotifywatch.

Para os nossos propósitos, só estamos interessados em dois eventos:

“criar” – quando um ficheiro é criado no directório de destino.

  • “move_para” – quando um ficheiro é movido de outro local para o directório de destino.
  • Vamos tentar inotifywatch novamente, mas desta vez instruindo-o a monitorizar apenas estes dois eventos. Executar este comando na primeira janela terminal:

Na segunda janela de terminal ou separador, vamos tentar criar um novo ficheiro, alterando o seu conteúdo, e depois mover o ficheiro de outro local para o directório de destino. Todos estes comandos são executados a partir do directório home.

Voltar à primeira janela de terminal e parar o inotifywatch, premindo CTRL+C. Veremos a seguinte saída:

Apenas dois eventos foram contados: criar um ficheiro chamado “create. txt” e mover um ficheiro existente chamado “create2.txt”. Tudo o resto, tal como modificar “created. txt”, foi ignorado.

Ver um Directório e Executar uma Tarefa

Agora que sabemos quais os eventos a seguir, podemos utilizar outra ferramenta chamada inotifywait para bloquear a execução até que um ficheiro seja criado ou movido para o nosso directório de destino. Vamos utilizar os mesmos argumentos que utilizámos com o inotifywatch e também especificar como queremos que o nome do ficheiro seja formatado para utilização na nossa tarefa.

Antes de começarmos, precisamos de um directório para guardar ficheiros que já tenham sido processados. Criar um directório chamado “processado”:

A seguir, criar um novo script chamado “watch-incoming. sh” e adicionar os conteúdos listados abaixo:

O guião executa o comando inotifywait com a opçã o-m. Isto faz com que o comando monitor mude indefinidamente. Cada vez que um novo evento é detectado, o nome do ficheiro é passado para o comando read e injectado na variável “FILENAME”. O bloco sob o laço while é executado, no qual o ficheiro é primeiro movido para o directório “processado” e depois gzipado. O ficheiro original é substituído pelo ficheiro comprimido, e o nome do ficheiro terminará em “.gz”.

Vamos conceder permissões de execução neste guião e executá-lo a partir do nosso directório home.

Abra a segunda janela de terminal e crie um novo ficheiro no directório “incoming”. Liste o conteúdo tanto do directório “incoming” como do “processado” para ver os resultados do evento que está a ser detectado:

O ficheiro de texto em bruto que copiámos para a directoria “incoming” foi detectado pelo script, copiado para “processado” e depois comprimido usando gzip.

Podemos fazer algumas tarefas interessantes agora que podemos assistir à chegada de novos ficheiros num directório. Por exemplo, podemos adicionar uma marca de água a ficheiros de imagem, comprimir vídeos em bruto no formato mp4 e até carregar cada novo ficheiro que vemos para um balde S3 da Amazon. Este script é um bom ponto de partida para rolar os seus próprios fluxos de trabalho e automatizar tarefas comuns no seu sistema.

Tenho uma pasta com o nome de imagens na minha caixa de linux. Esta pasta está ligada a um site e o administrador do site tem a capacidade de adicionar imagens a este site. No entanto, quando uma imagem é adicionada, quero um comando para executar o redimensionamento de todas as imagens de um directório.

Em suma, quero saber como posso fazer o servidor executar um comando específico quando um novo ficheiro é adicionado a um local específico.

6 Respostas 6

Pode agora optar por ordenar por Trending , o que impulsiona os votos que aconteceram recentemente, ajudando a emergir respostas mais actualizadas.

A tendência é baseada na classificação mais alta e cai de volta a ela se não houver tendência.

Não sei como é que as pessoas estão a carregar conteúdo para esta pasta, mas talvez queira utilizar algo de mais baixo nível tecnológico do que monitorizar o directório com a inotificação.

Se o protocolo for FTP e tiver acesso ao log do seu servidor FTP, sugiro que siga esse log para observar os uploads bem sucedidos. Este tipo de abordagem accionada por eventos será mais rápida, mais fiável, e menos carga do que uma abordagem de sondagem com o cron tradicional, e mais portátil e mais fácil de depurar do que algo que utilize o inotify.

A forma de lidar com isto dependerá, naturalmente, do seu servidor FTP. Tenho um running vsftpd cujos logs incluem linhas como esta:

A linha UPLOAD só é adicionada quando o vsftpd tiver guardado o ficheiro com sucesso. Pode analisar isto num script de shell como este:

Se estiver a utilizar uma ferramenta de carregamento HTTP, veja se essa ferramenta tem um ficheiro de registo de texto que utiliza para registar os ficheiros recebidos. Se não considerar adicionar-lhe algum tipo de função de registador, então produzirá registos que poderá seguir.

Ei, Scripting Guy! É possível ter um script executado automaticamente sempre que um ficheiro é adicionado a uma pasta específica?

Olá, WM. Sim, isto é possível, graças à magia dos eventos WMI, que lhe permitem escrever um guião para monitorizar algo de interesse (como um ficheiro a ser adicionado a uma pasta) e depois tomar alguma acção sempre que um evento como este ocorra. Não temos tempo para discutir os eventos WMI em qualquer detalhe nesta coluna, mas podem ser incrivelmente úteis aos escritores de guião. Consequentemente, pode valer a pena consultar esta coluna de Contos a partir do Roteiro.

Entretanto, aqui está um guião que monitoriza a pasta C:\Scripts. Sempre que um ficheiro é adicionado a esta pasta, o guião responde ecoando o nome desse novo ficheiro:

Mais uma vez, há demasiadas coisas a acontecer aqui para percorrer o script passo a passo, mas o que procuramos são instâncias da classe __InstanceCreationEvent; instâncias desta classe são automaticamente criadas sempre que um novo objecto gerido (ou seja, algo que o WMI conhece) é criado num computador. Embora a consulta seja um pouco complicada, resume-se a isto: queremos ser alertados para quaisquer novos itens que surjam em C:\Scripts. (Note-se que C:\\\\Scripts não é um erro de impressão; é realmente necessário que os quatro cortes sejam feitos aqui).

Também precisamos de mencionar que um script WMI como este funciona através de “sondagens”; sai periodicamente e verifica se foram acrescentados novos ficheiros à pasta. Para esta amostra, estamos a verificar a cada 10 segundos (é o que o WITHIN 10 representa) para ver se existem novos ficheiros na pasta. Se isso for demasiado rápido ou demasiado lento, pode alterar esse valor para o que quiser. Tenha em mente duas coisas, no entanto. Para uma, se sondar com demasiada frequência (digamos, a cada segundo), terá um guião que está constantemente a correr, e poderia teoricamente colocar um esgotamento nos recursos do seu sistema.

Inversamente, se o valor for demasiado longo, poderá perder novos ficheiros, assumindo que são adicionados e depois apagados antes de o tempo de sondagem expirar. Por exemplo, digamos que o seu script verifica a cada 5 minutos se há novos ficheiros. Se adicionar 100 novos ficheiros e depois apagar todos esses ficheiros 3 minutos mais tarde, o script nunca saberá que esses ficheiros foram adicionados à pasta. Isto porque scripts como este funcionam ao comparar os ficheiros que actualmente se encontram na pasta com os ficheiros que estavam na pasta da última vez que o script foi verificado. Brinque com o intervalo das sondagens e veja o que funciona melhor para si.

Como notámos, este script simplesmente ecoa o nome de qualquer novo ficheiro adicionado a C:\Scripts. E se quiser fazer algo um pouco mais extravagante sempre que um ficheiro for adicionado à pasta? Não há problema; basta substituir esta linha de código pelo código que deseja executar sempre que um novo ficheiro for detectado:

A propósito, prefere ser notificado sempre que um ficheiro é apagado de C:\Scripts? Isso é suficientemente fácil; basta monitorizar C:\Scripts para novas instâncias da classe __InstanceDeletionEvent:

Ei, nós dissemos-lhe que valia a pena conhecer os eventos do WMI!

Alguém poderia, por favor, fornecer o código para fazer o seguinte: Assumir que existe um directório de ficheiros, todos os quais têm de ser executados através de um programa. O programa produz o

O seguinte código de bash passará $file para comando onde $file representará cada ficheiro em /dir

-maxdepth 1 argumento impede que o achado desça recursivamente para quaisquer subdirectórios. (Se quiser que tais directórios aninhados sejam processados, pode omitir isto).

-typ e-f especifica que apenas os ficheiros simples serão processados.

A tendência é baseada na classificação mais alta e cai de volta a ela se não houver tendência.

Não sei como é que as pessoas estão a carregar conteúdo para esta pasta, mas talvez queira utilizar algo de mais baixo nível tecnológico do que monitorizar o directório com a inotificação.

\denota o fim do comando.

  • Finalmente, a saída de todas as execuções cmd individuais é redireccionada para resultados. out
  • No entanto, se se preocupar com a ordem em que os ficheiros são processados, talvez seja melhor escrever um laço. Penso que encontrará os ficheiros em ordem inode (embora possa estar errado quanto a isso), o que pode não ser o que deseja.
  • Estou a fazer isto no meu Raspberry Ri a partir da linha de comando, correndo:<>As respostas aceites/elevadas são óptimas, mas faltam-lhes alguns detalhes de grãozinho. Este post cobre os casos sobre como lidar melhor com a expansão do caminho de shell-name (glob), quando os nomes dos ficheiros contêm novas linhas/símbolos de traço incorporados e movendo o comando de redireccionamento de saída do for-loop ao escrever os resultados para um ficheiro.<>
  • Ao executar a expansão shell glob usando *, há a possibilidade da expansão falhar se não houver ficheiros presentes no directório e uma cadeia glob não expandida será passada para o comando a ser executado, o que poderá ter resultados indesejáveis. A shell bash fornece uma opção de shell estendida para isto utilizando nullglob . Assim, o laço torna-se basicamente o seguinte dentro do directório que contém os seus ficheiros
  • Isto permite-lhe sair com segurança do loop for quando a expressão ./* não devolve nenhum ficheiro (se o directório estiver vazio)

ou de uma forma compatível com o POSIX ( nullglob é específico da bash)

Isto permite-lhe entrar no laço quando a expressão falha por uma vez e a condição [ – f “$file” ] verificar se a string não expandida ./* é um nome de ficheiro válido nesse directório, o que não seria. Assim, nesta condição de falha, utilizando continuar, voltamos ao for loop que não será executado posteriormente.

Note também o uso de – imediatamente antes de passar o argumento do nome do ficheiro. Isto é necessário porque, como já foi dito anteriormente, os nomes dos ficheiros shell podem conter traços em qualquer parte do nome do ficheiro. Alguns dos comandos shell interpretam isso e tratam-nos como uma opção de comando quando o nome não é citado correctamente e executam o comando pensando se a bandeira é fornecida.

O – assinala o fim das opções de linha de comando nesse caso, o que significa que o comando não deve analisar quaisquer strings para além deste ponto como bandeiras de comando, mas apenas como nomes de ficheiro.

A dupla citação dos nomes de ficheiro resolve adequadamente os casos em que os nomes contêm caracteres globais ou espaços brancos. Mas *nomes de ficheironix também podem conter novas linhas. Assim, deslimitamos os nomes de ficheiro com o único caracter que não pode fazer parte de um nome de ficheiro válido – o byte nulo ( \0 ). Uma vez que a bash usa internamente cordas estilo C em que os bytes nulos são usados para indicar o fim da corda, é o candidato certo para isso.

Assim, usando a opção printf da shell para delimitar ficheiros com este byte NULL usando a opçã o-d do comando read, podemos fazer abaixo

O nullglob e o printf são enrolados (…) o que significa que são basicamente executados numa sub-capa (concha infantil), porque para evitar a opção do nullglob de reflectir sobre a concha parental, uma vez que o comando sai. A opçã o-d ” do comando ler não é compatível com o POSIX, pelo que necessita de uma concha de bash para que isto seja feito. Usando o comando find, isto pode ser feito como

Para encontrar implementações que não suporta m-print0 (além das implementações GNU e FreeBSD), isto pode ser emulado usando o printf

Outra correcção importante é mover o redireccionamento para fora do for-loop para reduzir um elevado número de I/O de ficheiros. Quando utilizada dentro do laço, a shell tem de executar chamadas de sistema duas vezes para cada iteração do for-loop, uma para abrir e outra para fechar o descritor de ficheiro associado ao ficheiro. Isto tornar-se-á um gargalo de garrafa no seu desempenho para executar grandes iterações. A sugestão recomendada seria movê-lo para fora do laço.

Estendendo o código acima com estas correcções, poderia fazer

que basicamente colocará o conteúdo do seu comando para cada iteração do seu ficheiro de entrada na stdout e quando o laço terminar, abra o ficheiro alvo uma vez para escrever o conteúdo da stdout e guardá-lo. A versão equivalente de procura do mesmo seria

Por vezes, precisamos de copiar os ficheiros ou pastas em vez de ter um programa de cópia de segurança. Os ficheiros podem ser copiados com o mesmo nome, ou também se pode alterar o nome.

Copiar um ficheiro, pasta, ou directório é uma tarefa simples e básica no sistema operativo Linux. Os comandos de renomear, apagar ou copiar são utilizados como operações diárias enquanto se trabalha com a interface da linha de comandos.

Embora existam comandos múltiplos para copiar os ficheiros, os comandos ” cp ” e ” rsync ” são amplamente utilizados como abordagens mais simples.

Como copiar os ficheiros com o comando “cp” no Linux:

O comando ” cp” é um dos comandos normalmente utilizados para realizar a operação de cópia. É possível copiar ficheiros ou pastas da fonte para o destino, i-e, um directório através deste comando.

A sintaxe do comando ” cp ” é:

Vejamos um exemplo para compreender melhor a ferramenta de comando “cp”.

No directório home, criar uma pasta ” temp ” com o ficheiro de texto chamado ” text_file1.txt ” e adicionar-lhe conteúdo aleatório.

Copie um ficheiro com o mesmo nome:

Para copiar um directório de ficheiro ” text_file1.txt ” com o mesmo nome, abra o terminal e escreva o comando ” cp ” mencionado com o caminho correcto.

Obter o caminho da pasta clicando com o botão direito do rato no ficheiro e navegar para a opção ” Propriedades ” (é a forma fácil de obter o link do caminho).

Abre-se uma caixa de diálogo com o caminho completo de um ficheiro de texto:

Utilize este caminho com o comando ” cp ” para copiar o ficheiro:

Este comando irá copiar o ficheiro ” text_file1.txt ” para a pasta ” temp2 “.

Para o verificar, digite o comando ” ls ” no terminal:

Copiar um ficheiro com um nome diferente:

Para copiar o ficheiro no directório de trabalho actual com o nome diferente, digite o seguinte comando ” cp ” com a localização do ficheiro:

Verificá-lo utilizando o comando ” ls “:

Copiar Ficheiros Múltiplos com o comando “cp”:

Para copiar múltiplos ficheiros com o comando ” cp “, navegue no terminal para o directório onde os ficheiros são guardados e depois execute o comando ” cp ” com os nomes dos ficheiros que pretende copiar e o caminho de destino.

$ cd / home / wardah / temp

$ cp text_file1.txt text_file2.txt text_file3.txt / home / wardah / temp2

Executar o referido comando para verificar se os ficheiros são copiados com sucesso:

Os cenários acima mencionados são como copiar um único ficheiro ou um ficheiro seleccionado num directório. Agora, utilize o carácter curinga ( * ) para copiar ficheiros presentes de um directório para qualquer outro directório específico.

Vamos verificar como funciona:

Execute o comando ” ls ” para verificar quantos ficheiros existem na directoria temporária:

Em vez de mencionar todos os nomes de ficheiros no terminal, use o wildcard ( * ) com o caminho do directório para copiar todos os ficheiros para o destino:

Agora, execute novamente o comando “ls” para verificar se todos os ficheiros são copiados no directório ” temp2 “:

Como copiar os ficheiros com o comando “rsync” no Linux:

O comando ” rsync ” é outra ferramenta versátil do Linux para sincronizar e copiar ficheiros e directórios tanto localmente como remotamente.

A sintaxe do comando ” rsync ” é a de copiar ficheiros:

É uma ferramenta pré-construída em muitas distribuições Linux. No entanto, se não o obtiver no seu sistema, instale-o executando o seguinte comando:

Para copiar um ficheiro de um local para outro, execute o seguinte comando:

Para confirmar, digite:

Para copiar todos os ficheiros do directório para outro local, o comando seria

(O comando ” – a ” com o comando ” rsync ” é utilizado para copiar directórios recursivamente)

Aqui estão os dois conceitos:

Se se adicionar uma barra de arrasto ( / ) com o caminho, este irá copiar o conteúdo do directório de origem para o directório de destino, tal como mostrado na imagem:

Mas, se não a adicionar, copiará o directório de origem dentro do directório de destino, tal como mostrado na imagem:

O comando acima copiará um directório ” dir1 ” para o directório ” dir2 “.

Conclusão:

A cópia de um ficheiro ou directório é o comando básico que se pode utilizar. Pode-se utilizá-lo várias vezes enquanto se utiliza o sistema operativo Linux.

Este guia tem visto as duas abordagens mais simples, o comando ” cp ” e o comando ” rsync “. Usando estes comandos, aprendemos a copiar um único ficheiro, vários ficheiros, e até mesmo copiar um directório para outro.

Sobre o autor

Wardah Batool

Sou Engenheiro de Software Licenciado e Auto-Motivado escritor de Linux. Também gosto de ler os últimos livros de Linux. Além disso, no meu tempo livre, adoro ler livros sobre Desenvolvimento Pessoal.

Se tiver vários computadores na sua rede, e quiser ser capaz de partilhar ficheiros e pastas do seu sistema operativo Linux, o processo não é tão difícil como pensa. E embora algumas distribuições Linux se esforcem por fazer disto uma questão de apontar e clicar, tendem a ficar aquém das expectativas.

É aí que precisa de se virar para o Samba e para a janela do terminal. Mas não tema, vou mostrar-lhe como isto é feito em termos simples e claros. Uma vez terminado, qualquer pessoa na sua LAN deverá ser capaz de aceder a essas pastas e ficheiros partilhados.

A ZDNet recomenda

As melhores aulas da Fundação Linux

Quer um bom trabalho técnico? Então precisa de conhecer o Linux e o software de código aberto. Uma das melhores formas de aprender é através de um curso da Linux Foundation.

Para que isto funcione, necessitará de uma instância de Linux em execução e de um utilizador com privilégios de sudo. Vou demonstrar o processo com o Ubuntu Desktop 22.04 de fácil utilização, mas o processo será o mesmo para a maioria das distribuições (a única excepção é a instalação do Samba).

Dito isto, vamos passar à partilha.

Instalação de Samba

A primeira coisa que devemos fazer é instalar o Samba. Vamos fazer isso a partir da linha de comando, por isso inicie sessão no seu ambiente de trabalho Linux e abra a sua aplicação de janela de terminal. Com o terminal aberto, instale o Samba com:

Se estiver num ambiente de trabalho baseado em Fedora (ou baseado em RHEL), essa instalação seria:

Poderá descobrir que o Samba já está instalado por defeito. Seja como for, está pronto para continuar.

Comece e active o serviço Samba:

Alguns gestores de ficheiros Linux permitem-lhe partilhar pastas directamente de dentro da aplicação GUI. Vou partilhar consigo o processo manual, no caso de o seu gestor de ficheiros não incluir essa opção.

Criar a partilha

Digamos que a pasta que deseja partilhar é a pasta Pública no seu directório pessoal (por isso /home/USER/Público – onde USUÁRIO é o seu nome de utilizador). De volta à janela do terminal, vamos abrir o ficheiro de configuração Samba com o comando:

No fundo desse ficheiro, cole o seguinte:

Onde USUÁRIO é o seu nome de utilizador.

Nota: Se não quiser que outros utilizadores possam fazer alterações em ficheiros e pastas, defina escrevível para não.

Guarde e feche o ficheiro. Reinicie o Samba com:

Neste momento, a sua partilha de Samba será visível para a rede, mas não permitirá que ninguém aceda a ela. Vamos corrigir isso.

Vou assumir que você é o único utilizador na sua máquina Linux. No entanto, não quer estar a distribuir as suas credenciais de login a outros utilizadores e não quer permitir o acesso anónimo ao directório partilhado (pois isso poderia ser uma questão de segurança). Então, o que é que fazemos? Vamos criar uma nova conta na sua máquina que possa ser utilizada por outros para aceder aos ficheiros e pastas.

Na janela do terminal, crie um utilizador chamado guestshare com o comando:

Dê a esse utilizador uma senha única e forte, nomeie Samba Guest (ou algo do género), e depois basta premir Enter no seu teclado para as restantes questões.

A seguir, temos de activar esse utilizador para Samba, por isso execute os dois comandos seguintes:

O primeiro comando acima adiciona o utilizador e o segundo comando habilita o utilizador.

Depois de introduzir o primeiro comando, ser-lhe-á pedido para adicionar uma nova palavra-passe para o Samba. Pode usar a mesma palavra-passe que adicionou quando criou a conta de guesthare.

Qualquer utilizador na sua rede deve agora poder aceder a essa pasta utilizando as credenciais de guesthare.

E é tudo o que existe para criar uma pasta partilhada no Linux a partir do seu directório pessoal de utilizadores. Os utilizadores não só podem ver os ficheiros e pastas dentro, como também podem criá-los e modificá-los.

Não deve ter de tomar conta de todas as cópias dos ficheiros; as tarefas agendadas são perfeitas para automatizar este trabalho.

Copiar ficheiros para outra pasta ou servidor é uma tarefa trivial, não importa como o faça. Há várias maneiras de fazer o trabalho: arrastar e largar o ficheiro no Explorador do Windows, Copy-Item com PowerShell ou o comando de cópia simples no DOS. É apenas uma questão de especificar uma fonte e um caminho de destino e definir alguns outros parâmetros opcionais. Só quando se começa a copiar muitos ficheiros com frequência é que se depara com problemas.

Ao automatizar cópias de ficheiros, especialmente num ambiente Windows, a sua linguagem de scripting vai ser o Windows PowerShell. Se precisar de copiar rapidamente um ou mais ficheiros de uma pasta para outra, o PowerShell é uma óptima maneira de o fazer. Além disso, não só é fácil t

Crie o seu Script

Primeiro é necessário criar um guião para realizar transferências de ficheiros. Vamos chamar ao guião CopyFiles. ps1 . Este script irá conter o seguinte código:

Como pode ver, o script é simples, mas deixa espaço para muita personalização, dependendo do seu ambiente.

A parte mais complicada deste script é a secção param(). Este é um bloco de parâmetros contendo dois parâmetros: SourcePath e DestinationPath . Ao fazer estes dois valores, os parâmetros permitem-nos passar valores diferentes para o nosso script, para que o possamos reutilizar. Se SourcePath e DestinationPath fossem caminhos reais, teríamos de criar scripts separados para cada cópia de ficheiro diferente!

O arranque manual deste script será algo parecido com isto:

Este exemplo copiaria todos os ficheiros e subpastas da pasta C:\Source para a pasta partilhada de Destino.

Criar e uma tarefa agendada

Agora que tem o seu CopyFiles. ps1 PowerShell script, dirija-se ao computador onde gostaria de dar o pontapé de saída. Neste exemplo, vamos criar uma tarefa agendada para executar este guião uma vez por dia às 3 da manhã.

Poderá criar tarefas agendadas executando a GUI do Agendador de Tarefas e criando uma dessa forma, mas aqui o que está em causa é a automação. Vamos aprender a criar a tarefa agendada também no PowerShell. Para o fazer, terá de completar quatro etapas aproximadas:

Criar a acção da tarefa agendada.

Crie o gatilho.

Crie a tarefa agendada em memória.

Crie a tarefa agendada no computador.

Eis o que isso parece na prática. Primeiro, vamos criar a acção da tarefa agendada. Isto define o EXE a ser executado juntamente com quaisquer argumentos. Aqui, assumo que o seu script está localizado em C:\CopyFiles. ps1 .

A seguir, criaremos um gatilho para o iniciar às 3 da manhã todos os dias.

A seguir, criaremos a tarefa programada em memória, usando a acção e o gatilho que acabámos de criar.

Finalmente, criaremos de facto a tarefa agendada no sistema, chamando-lhe File Transfer Automation e executando-a sob a conta do administrador local com a palavra-passe fornecida.

Suponha que eu tenho dois utilizadores Alice e Bob e um grupo GROUPNAME e uma pasta foo , ambos os utilizadores são membros do GROUPNAME (usando Linux e ext3).

Se eu guardar como utilizador Alice um ficheiro sob foo , as permissões são: – rw-r-r – Alice Alice . Contudo, é possível conseguir que cada ficheiro guardado sob alguma subdirectoria de foo tenha permissõe s-rwxrwx – Alice GROUPNAME (ou seja, proprietária Alice, grupo GROUPNAME)?

3 Respostas 3

No Linux, certifique-se de que o sistema de ficheiros que está a utilizar suporta ACLs (a maioria dos sistemas de ficheiros unix suporta). Poderá ter de alterar as opções de montagem para activar ACLs: com ext2/ext3/ext4, o kernel por defeito desde 2.6.39 é para activar ACLs. Em kernels mais antigos pode ser necessário especificar explicitamente a opção de montagem acl, pelo que a entrada em /etc/fstab deve parecer-se com /dev/sda1 / ext4 errors=remount-ro, acl 0 1 . Executar moun t-o remount, acl / para activar ACLs sem reiniciar. Instale também as ferramentas de linha de comando ACL getfacl e setfacl , normalmente fornecidas num pacote chamado acl .

Agora que a configuração única acabou, altere a ACL do directório para dar permissões de escrita ao grupo e para fazer com que estas permissões sejam herdadas por ficheiros recentemente criados. Sob Linux:

Se as ACLs não forem uma opção, faça o directório propriedade do grupo GROUPNAME , e defina as suas permissões para 2775 ou 2770: chmod g+rwxs /path/to/directory . O s aqui significa o bit setgid; para um directório, significa que os ficheiros criados neste directório pertencerão ao grupo que possui o directório.

Terá também de definir a máscara de Alice e Bob para que todos os seus ficheiros possam ser escritos em grupo por defeito. A umask predefinida na maioria dos sistemas é 022, o que significa que os ficheiros podem ter todas as permissões excepto escrever por grupo e outros. Altere isso para 002, o que significa proibir apenas a escrita por outra permissão. Normalmente, colocaria essa definição no seu

Os seguintes comandos são utilizados para trabalhar com ficheiros e directórios.

Este comando mostra o actual directório de trabalho em que se encontra actualmente.

No exemplo seguinte estou dentro do directório yusufshakeel que se encontra dentro do directório home.

Este comando irá listar o conteúdo de um directório.

No exemplo seguinte estamos a listar o conteúdo de um directório.

l s-la

Este comando listará todo o conteúdo de um directório incluindo os ficheiros e directórios ocultos.

No exemplo seguinte, listamos todo o conteúdo de um directório.

mkdir

Este comando irá criar um novo directório, desde que não exista.

No exemplo seguinte, estamos a criar um novo exemplo de directório .

mkdi r-p

Este comando irá criar directórios aninhados.

No exemplo seguinte estamos a criar directórios mundiais que se encontram dentro do directório olá que se encontra dentro do directório de exemplo.

rmdir

Este comando irá remover/eliminar um directório existente, desde que este esteja vazio.

No exemplo seguinte será removido/apagado um exemplo de directório existente .

Este comando é utilizado para mudar de directório.

No comando seguinte, estamos a mudar para o directório raiz.

No comando seguinte estamos a mudar para /var/wwww/html directório.

Este comando irá levar-nos um nível acima da árvore de directórios.

Exemplo: Se estivermos dentro do directório world que está dentro do directório hello, isto é, /hello/world então, cd … levar-nos-á um nível até ao directório hello.

tocar no nome do ficheiro

Este comando irá criar um novo ficheiro.

No exemplo seguinte, estamos a criar um novo ficheiro hello. txt .

rm nome do ficheiro

Este comando irá apagar um ficheiro.

No exemplo seguinte, estamos a apagar um ficheiro com o nome hello. txt .

r m-f nome do ficheiro

Este comando apaga forçosamente um ficheiro.

No exemplo seguinte, estamos a apagar forçosamente um ficheiro com o nome hello. txt .

r m-r directório

Este comando apaga um directório recursivamente juntamente com o seu conteúdo.

No exemplo seguinte estamos a apagar um exemplo de directório juntamente com o seu conteúdo.

directório r m-rf

Este comando apaga forçosa e recursivamente um directório juntamente com o seu conteúdo.

No exemplo seguinte estamos a apagar forçosamente um exemplo de directório juntamente com o seu conteúdo.

Tenha cuidado ao executar a operação de apagar.

ficheiro cp1 ficheiro2

Este comando copia o conteúdo do ficheiro1 em ficheiro2 .

Se o ficheiro ficheiro2 não existir, então é criado. Se existir, então o seu conteúdo é sobrescrito.

No exemplo seguinte, estamos a copiar o conteúdo do ficheiro hello. txt para hi. txt .

c p-r dir1 dir2

Este comando copia o conteúdo da directoria dir1 na directoria dir2 .

Se o directório dir2 não existir, então é criado. Se existir, então o seu conteúdo é sobreescrito.

No seguinte exame

No exemplo seguinte estamos a mover o ficheiro hello. txt do exemplo de directório para o fantástico directório .

No exemplo seguinte estamos a mover exemplo de directório dentro do directório /var/wwww/html.

nome de ficheiro de gato

Isto irá imprimir o conteúdo de um ficheiro.

No exemplo seguinte, vamos obter o conteúdo do ficheiro hello. txt no terminal.

nome do ficheiro principal

Este comando irá imprimir as primeiras 10 linhas de um ficheiro.

No exemplo seguinte, vamos obter as primeiras 10 linhas do ficheiro fruits. txt .

nome do ficheiro de cauda

Este comando irá imprimir as últimas 10 linhas de um ficheiro.

No exemplo seguinte, vamos obter as últimas 10 linhas do ficheiro fruits. txt .

tai l-f nome do ficheiro

Isto imprimirá as últimas 10 linhas de um ficheiro e continuará a imprimir novas linhas à medida que estas forem sendo anexadas ao ficheiro.

Isto é útil ao verificar os registos de actividade ao vivo.

No nosso mega guia de endurecimento e segurança do CentOS 7, na secção “proteger o sistema internamente”, uma das ferramentas de segurança úteis que listamos para a protecção do sistema interno contra vírus, rootkits, malware, e detecção de actividades não autorizadas é AIDE .

O AIDE ( Advanced Intrusion Detection Environment ) é uma pequena mas poderosa ferramenta de detecção de intrusão de código aberto gratuita, que utiliza regras predefinidas para verificar a integridade de ficheiros e directórios em sistemas operativos do tipo Unix, tais como Linux. É um binário estático independente para configurações simplificadas de monitorização cliente/servidor.

É rico em características: utiliza ficheiros de configuração de texto simples e base de dados tornando-o fácil de utilizar; suporta vários algoritmos de digestão de mensagens, tais como, mas não limitados a md5, sha1, rmd160, tiger; suporta atributos de ficheiros comuns; suporta também expressões regulares poderosas para incluir ou excluir selectivamente ficheiros e directórios a serem digitalizados.

Também pode ser compilado com suporte excepcional para a compressão Gzip, Posix ACL, SELinux, XAttrs e atributos do sistema de ficheiros Extendido.

O Aide funciona através da criação de uma base de dados (que é simplesmente um instantâneo de partes seleccionadas do sistema de ficheiros), a partir das regras de expressão regulares definidas no(s) ficheiro(s) de configuração. Uma vez iniciada esta base de dados, é possível verificar a integridade dos ficheiros do sistema contra ela. Este guia mostrará como instalar e utilizar um assistente no Linux.

Como instalar o AIDE no Linux

O Aide é empacotado em repositórios oficiais das principais distribuições Linux, para o instalar execute o comando para a sua distribuição utilizando um gestor de pacotes.

Após a sua instalação, o ficheiro de configuração principal é o /etc/aide. conf . Para ver a versão instalada, bem como compilar parâmetros de tempo, corra o comando abaixo no seu terminal:

Exemplo de saída

Pode abrir a configuração usando o seu editor favorito.

Tem directivas que definem a localização da base de dados, localização dos relatórios, regras padrão, os directórios/arquivos a incluir na base de dados.

Compreensão das regras de ajuda por defeito

Utilizando as regras padrão acima mencionadas, pode definir novas regras personalizadas no ficheiro aide. conf, por exemplo.

A regra PERMS é utilizada apenas para controlo de acesso, detectará quaisquer alterações ao ficheiro ou directórios com base em ficheiro/di

Uma vez definidas as regras, é possível especificar o ficheiro e os directórios a observar. Considerando a regra PERMS acima, esta definição irá verificar as permissões de todos os ficheiros no directório raiz.

Isto verificará todos os ficheiros no directório /root para quaisquer alterações.

Para o ajudar a detectar quaisquer alterações nos dados dentro de todos os ficheiros/directórios em /etc/ , utilize isto.

Configurar as Regras de Ajuda para o Sistema de Ficheiros

Usando AIDE para verificar a integridade de ficheiros e directórios no Linux

Comece por construir uma base de dados contra as verificações que serão efectuadas usand o-init flag. Espera-se que isto seja feito antes do seu sistema ser ligado a uma rede.

O comando abaixo irá criar uma base de dados que contém todos os ficheiros que seleccionou no seu ficheiro de configuração.

Inicializar a base de dados Aide

Depois renomear a base de dados para /var/lib/aide/aide. db. gz antes de prosseguir, utilizando este comando.

Recomenda-se mover a base de dados para um local seguro possivelmente num suporte só de leitura ou noutra máquina, mas certifique-se de que actualiza o ficheiro de configuração para o ler a partir daí.

Após a criação da base de dados, pode agora verificar a integridade dos ficheiros e directórios usando a bandeir a-check.

Este irá ler o instantâneo na base de dados e compará-lo com os ficheiros/directórios encontrados no disco do sistema. Se encontrar alterações em locais que poderá não esperar, gera um relatório que poderá então rever.

Executar verificação de integridade do ficheiro

Uma vez que não foram feitas quaisquer alterações ao sistema de ficheiros, só se obterá uma saída semelhante à acima referida. Agora tente criar alguns ficheiros no sistema de ficheiros, em áreas definidas no ficheiro de configuração.

Em seguida, execute uma nova verificação, que deverá reportar os ficheiros adicionados acima. A saída deste comando depende das partes do sistema de ficheiros que configurou para verificação, pode ser um longo período de tempo suplementar.

Verificar Alterações do Sistema de Ficheiros

É necessário executar verificações de ajuda regularmente, e em caso de quaisquer alterações a ficheiros já seleccionados ou adição de novas definições de ficheiros no ficheiro de configuração, actualizar sempre a base de dados usando a opçã o-update:

Depois de executar uma actualização da base de dados, para utilizar a nova base de dados para futuras verificações, renomeie-a sempre para /var/lib/aide/aide. db. gz :

É tudo por agora! Mas tome nota destes pontos importantes:

Uma característica da maioria dos sistemas de detecção de intrusão AIDE inclusive, é que eles não fornecerão soluções para a maioria das falhas de segurança de um sistema. Contudo, ajudam a facilitar o processo de resposta à intrusão, ajudando os administradores de sistemas a examinar quaisquer alterações aos ficheiros/directórios do sistema. Por isso, deve estar sempre vigilante e continuar a actualizar as suas medidas de segurança actuais.

É altamente recomendável manter a base de dados recentemente criada, o ficheiro de configuração e o binário AIDE num local seguro, tal como um suporte só de leitura (possível se instalar a partir da fonte).

Para segurança adicional, considere a assinatura da configuração e/ou da base de dados.

Para informações e configurações adicionais, consulte a sua página de manual ou consulte a página inicial da AIDE: http://aide. sourceforge. net/

Se aprecia o que fazemos aqui em Te

Quero executar automaticamente um script sempre que novos ficheiros são copiados para uma directoria específica. Por outras palavras, existe no Linux uma forma de “observar” uma directoria para alterações e depois executar algo em resposta à alteração?

5 Respostas 5

Se tiver a sorte de estar numa distribuição baseada na debian, apt-get install dnotify . Outras distribuições provavelmente têm algo semelhante – procure o nome dnotify.

dnotify é um programa simples baseado no kernel Linux 2.4.19+’s dnotify API. dnotify pode executar um comando especificado cada vez que o conteúdo de um directório específico muda. É executado a partir da linha de comando e requer dois argumentos: um ou mais directórios para monitorizar e um comando para executar sempre que um directório tenha mudado. As opções controlam os eventos a desencadear: quando um ficheiro foi lido no directório, quando um foi criado, apagado e assim por diante.

Se quiser tratar disto dentro do seu próprio programa, dnotificar é também a API que pretende utilizar.

Pode executar um script com as inotify-tools, algo como isto. Ele observará o directório para alterações em ficheiros modificados, novos ficheiros, e ficheiros apagados, depois executará o script.

incron é basicamente o que se pretende, penso eu. Utiliza o inotify como mecanismo de notificação (que, como outros já assinalaram, supercedes dnotify), mas não requer um script que corre continuamente, utilizando o inotifywait ou similar (embora, obviamente, o daemon incron esteja sempre a correr). Os ‘crontabs’ e os ‘crontabs’ do utilizador são suportados de forma semelhante ao cron padrão, mas em vez de especificar os tempos como gatilhos, são utilizados eventos de inotificação e nomes de ficheiros/directórios.

O incron é embalado para muitas distribuições, incluindo Ubuntu e Debian, creio eu.

Há uma peça de software exclusivamente para este fim, autoenv É possível que queira verificar.

entr é a ferramenta de notificação de ficheiros mais simples e mais compostável que já vi. A sua utilização é optimizada para ver ficheiros em vez de directórios, mas também pode resolver o seu caso.

Para detectar e agir sobre o ficheiro adicionado, combine-o com outras ferramentas como, por exemplo, make . entr não envia o nome ou qualquer coisa do género, apenas executa o que lhe disse para executar.

Para verificar se há ficheiros adicionados num directório:

  • Se quiser agir também quando um ficheiro existente muda:
  • . e é aí que o mecanismo de loop vem a calhar, uma vez que a expressão find será executada novamente se um ficheiro for adicionado.
  • Se desejar um melhor tratamento de erros e quiser ter a certeza de que as coisas só correm uma vez por ficheiro adicionado/removido, as coisas ficam um pouco estranhas, mas para estes casos simples é brilhante.

EDIT: Se quiser fazer isto a nível de sistema, algo como incron , basta adicionar o script ao seu gestor de processos favorito (como s6, runit, systemd ou sysvinit e saltar o loop:

Se quiser saber como anexar texto ao fim de um ficheiro no Linux, então está no sítio certo. Pessoal, aqui vamos discutir quais são as várias formas de anexar texto a um ficheiro no Linux.

Tabela de Conteúdos

Cenários comuns para anexar o texto a um ficheiro

anexando os registos a um ficheiro de registo, geralmente feito por servidores.

guardando a saída de um comando a um ficheiro. Por exemplo, guardar a saída de um script num ficheiro para efeitos de depuração mais tarde.

copiar o conteúdo de um ficheiro para outro ficheiro. Por exemplo, criar um ficheiro de cópia de segurança antes de fazer qualquer alteração a um ficheiro.

concatenar o conteúdo de um grupo de ficheiros a outro ficheiro. Por exemplo, fundir um monte de ficheiros CSV para criar um novo ficheiro CSV.

Comandos do Linux para anexar texto a um ficheiro

são cat, echo, print, etc.

Vejamos alguns exemplos para anexar texto a um ficheiro no Linux.

1. Acrescentar texto ao fim de um ficheiro utilizando operadores de redireccionamento

” operadores. Estes são os operadores de redireccionamento de saída. A redireccionamento é o envio da saída para qualquer ficheiro.

Existem dois tipos de operadores de redireccionamento, ou seja, redireccionamento de entrada e redireccionamento de saída. “” chama-se redireccionamento de saída.

Para sua compreensão, eis como se parece o redireccionamento de entrada.

Aqui, a entrada do ficheiro i. e. linux. txt é enviada para o comando tr através do operador de redireccionamento de entrada. Irá imprimir os caracteres em maiúsculas, como mostrado acima na imagem.

Falando do operador de redireccionamento de saída, é utilizado para enviar a saída do comando para um ficheiro. Pode ser feito usando qualquer comando, seja gato ou eco. Vamos entendê-lo através do seguinte exemplo,

” porque aqui não vamos anexar texto ao fim de um ficheiro, mas apenas mostrar o conteúdo do ficheiro.

Vamos considerar o ficheiro linux. txt para mais exemplos.

” operador irá remover o conteúdo do ficheiro existente. Espero que a diferença seja eliminada entre os dois. Não se preocupe, discutiremos isto em mais pormenor.

Vamos mergulhar nas formas de como podemos anexar o texto no ficheiro usando vários comandos.

” é usado para anexar texto ao fim de um ficheiro que já tem conteúdo. Usaremos o comando cat e anexaremos isso ao nosso ficheiro linux. txt.

Considere que queremos anexar texto ao fim de um ficheiro, ou seja, linux. txt, como mostrado acima. Vamos dar uma olhada no comando abaixo:

Como mostrado acima, o texto de entrada é enviado para o ficheiro i. e. linux. txt. Usamos o comando cat mais uma vez com o operador do apêndice para imprimir o texto como mostrado no exemplo acima.

  • ” operador através do comando cat, estará a trabalhar dentro do modo editor. Para guardar o texto e terminar de anexar, pode premir Ctrl+D.
  • ” operador para o ficheiro. Vamos dar uma vista de olhos ao comando abaixo.
  • ” operador.
  • 4. O comando tee co m-a opção

O comando tee é utilizado para ler a entrada padrão e grava-a também na saída padrão, bem como nos ficheiros. A utilização do comando tee co m-a opção não sobregravará o conteúdo, mas anexá-lo-á ao ficheiro. Vamos entender através de um exemplo.

We use redirection operator (>>) to append data to an existing text file. However, we need to provide the data to be appended to the file. Some of the common commands that are used along with >>O texto no ficheiro linux. txt é redireccionado para o comando tee através do operador “|” e é anexado ao ficheiro linuxfordevices. txt. É possível ver que todos os dados são transferidos para o novo ficheiro.

5. Anexa utilizando “printf” no Linux

” operador no Linux. Basta adicionar o texto dentro das cotações e enviá-lo para o ficheiro como saída. Vamos dar uma vista de olhos ao comando abaixo:

Adding the text is possible with the “> ” and “>>6. Anexe o texto usando o comando awk

O comando awk é utilizado para realizar a acção específica sobre o texto, tal como é dirigido pela declaração do programa. Usando a palavra-chave BEGIN com o comando awk especifica que awk executará a acção como indicado no início uma vez antes de qualquer linha de entrada ser lida.

Por conseguinte, forneceremos o comando incluído dentro do BEGIN, como mostrado abaixo no exemplo. O comando para anexar o texto é fornecido na secção BEGIN, daí que o comando awk executará

Using “>” operator would send the output of the cat command to the linux. txt file. Further, I have used cat command without “>

Similarly, “>>” redirection operator is used to append text to the end of a file whereas “>

2. Using cat command with redirection operator (>>)

The “>>

You can see that the text has been appended at the bottom of the file. Remember while adding the text using “>>

3. Linux echo command with >>

The echo command is used to print the text, print the value of the variable and so on. If you want to have detail knowledge, you can check the tutorial on the echo command in Linux. While using the echo command, you need to add the text within quotations. The output of the echo command will be redirected through the”>>

You can see that the text “ I hope you understood the concept.” is appended at the bottom of the file. You can print the content of the file using cat command. Here also, the text is sent as output to the file through “>>

You might be thinking why we are using printf in Linux as it is used in C language to print the text. We know that printf is used to display the standard output. Folks, we can also use printf command to append the text using “>>

7. Save the list of files to another file using >>

We can also save the list of the files in any directory using ls command with “>>” operator. We have to just use ls command followed by the “>>

In this tutorial, we learned how to use the “>>