Como encontrar todos os arquivos .tex nos diretórios do Recurse Grep?

2

Eu quero expandir a pesquisa recursiva de links simbólicos para incluir apenas arquivos .tex find . -type l -name "Math*" -exec grep -d "recurse" word {} + . Pseudocódigo falhado 1

find . -type l -name "Math*" \
  -exec WHERE CHOOSE ONLY .tex files and Directories \
  -exec grep -d "recurse" word {} +

Não consigo digitar um comando para escolher arquivos e diretórios .tex. Em palavras, o pseudocódigo 2

  1. Encontre todos os links simbólicos com o nome "Math", que apontam para diretórios.
  2. Recarregue todos os diretórios com links simbólicos (acho que o grep está limitando aqui possivelmente)
  3. Do básico grep word na lista de arquivos

Como você pode fazer o passo (2)?

    
por Léo Léopold Hertz 준영 30.06.2016 / 16:48

2 respostas

2

Acho que isso deve ser uma das mais ridículas ordens de comando que eu já inventei:

$ find . -type l -name "Math*" -print0 |
  xargs -0 -n 1 -IXXX find XXX/ -type f -name "*.tex" -print0 |
  xargs -0 fgrep "word"
  1. Localize todos os links simbólicos chamados Math* .
  2. Execute find novamente em cada caminho encontrado, procurando por *.tex files. O xargs precisa usar -n 1 para chamar find com não mais de um nome de caminho. O nome do caminho será colocado no espaço reservado XXX .
  3. Chame fgrep (ou seja, grep -F , pois temos uma string de pesquisa fixa) com a string nos arquivos encontrados.
por 30.06.2016 / 17:34
1

Uma maneira de fazer isso:

find . -type l -name 'Math*' -print0 | \
xargs -0 sh -c \
    'find -L "$@" -type f -name "*.tex" -exec fgrep word /dev/null {} +' sh

A abominação sh -c '...' sh é necessária para lidar com o caso em que Math* pode ter espaços. Caso contrário, quando Math* não se expandir para nomes de arquivos com espaços , algo assim funcionaria:

find -L $(find . -type l -name 'Math*') -name '*.tex' \
    -exec fgrep word /dev/null {} +

O /dev/null garante que fgrep imprima um nome de arquivo mesmo quando ele tiver apenas um único arquivo para pesquisar.

Se você insistir nos links de resolução antes do grepping, isso também pode ser feito, ao preço de supor que (1) seus nomes de arquivos não contêm novas linhas e (2) você está usando xargs de findutils do GNU (% BSD xargs não aceita -d ):

find . -type l -name 'Math*' -exec readlink -f {} + | \
xargs -d '\n' sh -c \
    'find "$@" -type f -name "*.tex" -exec fgrep word /dev/null {} +' sh
    
por 30.06.2016 / 20:36