Omitir o diretório de destino dos resultados da pesquisa

4

Como posso evitar que find retorne o diretório que eu uso como raiz para começar a pesquisar nos resultados? por exemplo:

$ find targetDir -name 'target*'
targetDir/target1
targetDir/target2
targetDir/subDir/target3

em vez de:

$ find targetDir -name 'target*'
targetDir
targetDir/target1
targetDir/target2
targetDir/subDir/target3
    
por user1227038 03.01.2014 / 14:17

5 respostas

7

Use mindepth :

$ find targetDir -mindepth 1 -name 'target*'

De man find :

   -mindepth levels
          Do  not apply any tests or actions at levels less than levels (a
          non-negative integer).  -mindepth  1  means  process  all  files
          except the command line arguments.
    
por 03.01.2014 / 14:19
2

Com o GNU, o BSD ou o BusyBox, localize (ou seja, no Linux, * BSD ou Cygwin):

find targetDir -mindepth -name 'target*'

Se você só encontrar o POSIX (por exemplo, no Solaris ou no MINIX), a maneira mais fácil é mudar para o diretório de nível superior primeiro. Em seguida, o local da pesquisa tem o nome exclusivo . , que você pode excluir.

( cd targetDir && find . -name . -o -name 'target*' -print )

Se você realmente precisar executar a partir de outro diretório, poderá excluir os diretórios chamados targetDir , mas isso também excluirá itens como targetDir/something/targetDir .

Alternativamente, você pode fazer o shell fazer o trabalho para você. Use um conjunto de padrões para combinar todos os arquivos em um diretório . Uma desvantagem é que você receberá uma mensagem de erro de find se um dos padrões não corresponder.

find targetDir/..?* targetDir/.[!.]* targetDir/* -name 'target*'

Se você sabe que não há arquivos de ponto no diretório e que o diretório não está vazio, você pode ir com apenas * .

find targetDir/* -name 'target*'
    
por 04.01.2014 / 00:20
1

Um truque simples é fazer assim:

$ find targetDir/* -name 'target*'

Isso excluirá efetivamente o diretório raiz ( targetDir ) da pesquisa.

    
por 03.01.2014 / 14:26
0

Pode ser mais fácil especificar o que você realmente deseja, em vez de tentar ignorar as coisas que não deseja. Por exemplo, -type f retornará apenas arquivos regulares e, portanto, não exibirá o diretório inicial.

Mas isso realmente depende do que você está procurando e por que você quer se livrar do diretório base.

    
por 03.01.2014 / 14:33
0

ainda de outra forma: [apenas por uma questão de fornecer um, na ideia "timtowtdi"]

( cd targetDir && find . -name 'target*' ) | sed -e 's#^./#targetDir/#'

como uma função (mais flexível):

findin () { 
    targetdir="$1" ; target="$2" 
    ( cd "${targetdir}" && find . -name "${target}" ) | sed -e "s#^./#${targetdir}/#"
}

findin "targetDir" 'target*'
    
por 03.01.2014 / 15:48

Tags