Manipulando arquivos com espaço em branco em seus nomes

0

Eu tenho muitos arquivos que preciso examinar, especificamente grep para determinadas palavras-chave IN THE FILE, e não ele FILENAME. Eu tenho mais de 300 arquivos em um sistema de arquivos (então os arquivos estão em vários diretórios diferentes) e alguns têm espaço em branco em seus nomes.

quando procuro por preenchimento usando o find

find -type f

e imprime os resultados, alguns dos nomes dos arquivos vão em diferentes linhas que NÃO É BOM.

Como posso lidar com

    
por user2840647 09.02.2014 / 06:52

2 respostas

3

Algumas implementações do comando grep , como o GNU grep , podem reciclar diretórios por conta própria. Se você está procurando por "blahblah", você pode fazer isso:

$ grep -r "blahblah" .

Isto irá grep através de todos os arquivos e diretórios começando recursivamente no diretório atual, . (cuidado com algumas implementações, como versões antigas do GNU grep também seguirão links simbólicos ao descer a árvore de diretórios). Isso mostrará os nomes dos arquivos e o resultado que correspondeu ao padrão de pesquisa, um por linha. Se você quiser apenas os nomes de arquivos sem o conteúdo correspondente, adicione a opção -l a grep .

$ grep -rl "blahblah" .

Se você realmente quiser usar find , pode usar a capacidade de find de executar comandos em relação aos arquivos que encontrar, usando a opção -exec .

$ find . -type f -exec grep "blahblah" {} +

O + no final é a chave, pois determinará o número ideal de nomes de arquivos que find localiza e chamará grep carregando a linha de comando com quantos couberem. Esses nomes de arquivos serão colocados onde as chaves estão, {} . É mais fácil visualizar o que está fazendo, se substituirmos o comando echo no lugar de grep você verá o que quero dizer.

Exemplo

Digamos que eu tenha os dados de amostra a seguir.

$ mkdir -p dir{1..3}
$ touch file{1..3}
$ touch dir{1..3}/file{A..C}

Agora, quando eu executo o comando find acima usando echo como nosso grep :

$ find . -type f -exec echo {} +
./file2 ./file1 ./dir2/fileA ./dir2/fileB ./dir2/fileC ./dir3/fileA ./dir3/fileB ./dir3/fileC ./file3 ./dir1/fileA ./dir1/fileB ./dir1/fileC

Todos esses arquivos foram ecoados na tela por um único echo , portanto, este método é muito eficiente em chamar apenas echo ou grep apenas o número mínimo de vezes necessário, passando quantos nomes de arquivos puder para cada um.

Usando -type f acima, estamos pesquisando apenas em arquivos regulares , enquanto grep geralmente procuraria em todos os arquivos como fifos, sockets, devices (mas não necessariamente symlinks). Você pode passar uma opção -D skip para algumas versões de grep para evitar procurar dispositivos / sockets / fifos.

    
por 09.02.2014 / 06:58
0
find . -type f -print0 | xargs -0 grep yourstring

A opção -print0 para localizar, assim como seu -0 pendant para xargs, usa o byte nulo como separador, o que significa que os nomes dos arquivos podem ser o que você quiser e não haverá surpresas.

O problema real é que o separador interno de arquivos do shell (armazenado na variável IFS) é um espaço. Você pode mudá-lo para ser uma nova linha ou o que quiser, mas a solução real é usar o que mostrei acima.

    
por 10.02.2014 / 00:43