Executa comandos em arquivos ocultos

3

Eu corro o comando para procurar por frase em todos os arquivos:

cat *.* | grep blabla

Funciona bem, mas tenho problemas com arquivos e diretórios ocultos. O comando simplesmente não lida com eles. Ho para resolver esse problema?

    
por vico 21.01.2016 / 16:07

3 respostas

7

Por padrão, os arquivos ocultos (isto é, aqueles que começam com um período) são excluídos da expansão glob do shell bash. No entanto, você pode alterar isso usando a configuração dotglob , por exemplo,

$ mkdir dir
$ touch dir/.hidden dir/visible

$ echo dir/*
dir/visible

$ shopt -s dotglob
$ echo dir/*
dir/.hidden dir/visible

Você pode cancelar a opção depois com shopt -u dotglob

    
por steeldriver 21.01.2016 / 16:36
3

"Arquivos ocultos" são simplesmente arquivos cujo nome começa com um ponto. Em aplicativos GUIs, esses arquivos geralmente não são mostrados, daí o nome deles.

Você pode usar conchagem :

cat {*,.*} | grep blabla

O comando anterior inclui todos os arquivos sem ponto ( * ) e todos os arquivos que começam com um ponto ( .* ).

A propósito, este é um uso inútil de cat , e você deve escrever seu comando como:

grep blabla {*,.*} 
    
por dr01 21.01.2016 / 16:43
2

Use o comando find com o sinalizador OR lógico ( -o ) e -exec . . .\+ flag

 find . -maxdepth 1 \( -iname "*.*" -o -iname ".*"   \) -exec grep "MySearchTerm" {} \+ 

Explicação:

  • find é um comando recursivo que procura arquivos no diretório especificado. Nesse caso, é . do diretório de trabalho atual.
  • -maxdepth flag nos diz para ficar apenas no diretório atual. Se você quer ir recursivelly ou especificar quantos subdiretórios para descida, mude 1 para o número de níveis que você quer ir.
  • \( . . .\) part impede o shell de tratar isso como subshell, em vez de tratá-lo como agrupamento de argumentos para find .
  • -iname flags permitem especificar para quais nomes de arquivos procurar.
  • -o flag informará ao find para procurar por arquivos *.* ou arquivos que iniciam com ponto inicial, os arquivos ocultos.
  • -exec . . .{} structure permite executar um comando específico para operar nos arquivos encontrados. \+ dirá find para pegar todos os arquivos como argumentos para o comando que você deseja executar, neste caso grep .

Veja um pequeno exemplo, onde você pode ver SEARCHFILE.txt e .SEARCHFILE.txt encontrados:

DIR:/xieerqi
skolodya@ubuntu:$ find . -maxdepth 1 \( -iname "*.*" -o -iname ".*"   \) -exec grep "HelloWorld" {} \+ 2>/dev/null           
./SEARCHFILE.txt:HelloWorld ! I'm found
./localDir.txt:HelloWorld.so
./localDir.txt:HelloWorld.c
Binary file ./2015-05-05-raspbian-wheezy.img matches
./.SEARCHFILE.txt:HelloWorld ! I'm found
    
por Sergiy Kolodyazhnyy 21.01.2016 / 16:15