como usar expressões regulares com o comando find para filtrar o caminho?

0

Eu tenho um conjunto de diretórios como este:

/level1/user01/dir01
/level1/user01/dir02
/level1/user01/dir03
/level1/user01/dir04
/level1/user02/dir01
/level1/user02/dir02
/level1/user02/dir03
/level1/user02/dir04
/level1/user03/dir01
/level1/user03/dir02
/level1/user03/dir03
/level1/user03/dir04

Eu quero usar o find para pesquisar arquivos com a extensão .oz no diretório dir02 de cada usuário

eu posso usar

find /level1/ -name "*.oz"

mas eu só quero pesquisar apenas dentro dos diretórios dir02

Isso não funciona

find /level1/"[a-z][0-9]"/dir02 -name "*.oz"
    
por Emilio Galarraga 08.08.2017 / 02:43

2 respostas

3

Se você quiser especificar vários diretórios no primeiro argumento, isso dependerá apenas do seu shell. Então, em bash e zsh e similar (csh e tcsh?), Você usaria apenas um shell glob. O shell expande esse glob para os vários diretórios nos quais você está interessado e os alimenta para find , o que pode levar vários argumentos.

find /level1/*/dir02 -name "*.oz"

Alguns pontos adicionais:

  • A sintaxe aqui é uma glob, não uma regex.
  • Seu regex estava errado de qualquer forma. (Ignorando as citações) deveria ter sido /level1/[a-z]*[0-9]*/dir02 . Observe o * s.
  • Outra opção é -path , consulte man find , mas isso é mais complicado do que usar apenas globs de shell.
por 08.08.2017 / 02:49
0

Solução alternativa usando find com -path :

$ find /level1 -type f -path "/level1/user??/dir02/*.oz" -print

Isso imprimirá os caminhos de todos os arquivos regulares cujo caminho (completo) corresponde a /level1/user??/dir02/*.oz .

Se você souber que os arquivos estão no diretório dir02 (e não em um subdiretório dele), isso os listará:

printf '%s\n' /level1/user??/dir02/*.oz
    
por 25.08.2017 / 08:46