Grep procurando por arquivos que não existem

1

Eu queria procurar o texto "Iniciando o kernel" em um diretório, então fiz isso:

 [root@xilinx petalinux-v2013.10-final]# grep -r "Starting kernel"  
grep: warning: tools/packagemanager/lib/i686: recursive directory loop

grep: Xilinx-ZC702-14.7/build/linux/rootfs/targetroot/etc/init.d/functions: No such file or directory
grep: Xilinx-ZC702-14.7/build/linux/rootfs/targetroot/etc/rcS.d/S10flashdev: No such file or directory
grep: Xilinx-ZC702-14.7/build/linux/rootfs/targetroot/mnt/net: No such file or directory
grep: Xilinx-ZC702-14.7/build/linux/rootfs/targetroot/mnt/cf: No such file or directory
Binary file Xilinx-ZC702-14.7/pre-built/linux/images/u-boot.elf matches
Binary file Xilinx-ZC702-14.7/pre-built/linux/images/BOOT.BIN matches
Binary file Xilinx-ZC702-14.7/pre-built/linux/images/output.bin matches

Por que está pesquisando em arquivos que não existem? Por que recebo essas mensagens "Nenhum arquivo ou diretório"?

Além disso, por que ele está pesquisando arquivos binários quando eu dei a ele caracteres ASCII? Um arquivo binário pode conter uma string como a minha?

    
por gpuguy 11.03.2014 / 09:48

4 respostas

6

Isso é mais provável porque esses links não apontam para arquivos existentes.

Você deve examinar um dos arquivos, por exemplo:

ls -l Xilinx-ZC702-14.7/build/linux/rootfs/targetroot/etc/init.d/functions

e, em seguida, novamente ls para onde aponta.

Você também pode fazer:

ls -L Xilinx-ZC702-14.7/build/linux/rootfs/targetroot/etc/init.d/functions

que provavelmente também vai te cannot access: .... .

    
por 11.03.2014 / 09:51
5

grep , por padrão, não ignora arquivos inexistentes ou ilegíveis. Você precisa fornecer a opção -s ou --no-messages para que grep as ignore. Citando de man grep :

   -s, --no-messages
          Suppress  error  messages about nonexistent or unreadable files.
          Portability note: unlike GNU grep, 7th Edition Unix grep did not
          conform to POSIX, because it lacked -q and its -s option behaved
          like GNU grep's -q option.  USG-style grep also  lacked  -q  but
          its  -s  option  behaved  like GNU grep.  Portable shell scripts
          should avoid both -q and -s and  should  redirect  standard  and
          error output to /dev/null instead.  (-s is specified by POSIX.)
    
por 11.03.2014 / 09:59
2

Como você usa a opção -r , então grep pesquisará recursivamente, incluir links simbólicos.

-R, -r, --recursive
              Read all files under each directory, recursively;
              this is equivalent to the -d recurse option.

Como a resposta do @ Anthon, talvez alguns links simbólicos no diretório pai não existam ou estejam quebrados.

Por padrão, grep também pesquisa string em arquivo binário:

--binary-files=TYPE
              If the first few bytes of a file indicate that the file
              contains binary data, assume that  the  file  is  of  type  TYPE. 
              By default, TYPE is binary, and grep normally outputs either a 
              one-line message saying that a binary file matches, or no message 
              if there is no match. If TYPE is without-match, grep assumes that a 
              binary file does not match; this is equivalent to the -I option. 
              If TYPE is text, grep processes a binary file as if it were text;
              this is equivalent to the -a option. Warning: grep --binary-files=text
              might output binary garbage, which can have nasty side effects 
              if the output is  a  terminal  and  if  the terminal driver
              interprets some of it as commands.

Um arquivo binário também pode conter algumas seqüências de caracteres. Você pode fazer uma verificação simples usando o comando strings em um arquivo binário:

strings /usr/bin/basename
    
por 11.03.2014 / 10:09
0

man grep contém:

-I     Process a binary file as if it did not  contain  matching  data;
       this is equivalent to the --binary-files=without-match option.
    
por 11.03.2014 / 10:46

Tags