find não funciona com minha variável

3

Estou tentando encontrar o número de dirs e arquivos em um determinado diretório. Estou executando meu script bash assim:

ARCHIVE=/path/to/archive ./myScript

no meu script eu estou fazendo isso:

#find the number of non-empty directories in the given dir 
dirs=$(find $ARCHIVE -mindepth 1 -maxdepth 1 -not -empty -type d | wc -l)
#find the number of files in the given dir
msgs=$(find $ARCHIVE -type f | wc -l)

echo "Number of directories: $dirs"
echo "Total number of messages: $msgs"

Isso funciona muito bem quando estou executando o script em um subconjunto dos dados que estou vendo, que está localizado em um diretório no mesmo nível do script. No entanto, os dados reais estão no diretório de outra pessoa e quando eu o executo com a variável ARCHIVE definida para esse local, ambos os valores retornam como 0. Eu tenho um script semelhante que eu uso também, e o comando find não funciona o segundo diretório também. Estranhamente, eu uso alguns comandos egrep e eles funcionam muito bem para ambos.

Por que não posso usar o recurso dessa maneira?

    
por turbo 16.10.2013 / 16:23

2 respostas

1

Tente passar o diretório que você deseja pesquisar como um parâmetro para o script bash:

#!/usr/bin/env bash

# First argument to script shall be directory in which to search
ARCHIVE= 

#find the number of non-empty directories in the given dir 
dirs=$(find "$ARCHIVE" -mindepth 1 -maxdepth 1 -not -empty -type d | wc -l)
#find the number of files in the given dir
msgs=$(find "$ARCHIVE" -type f | wc -l)

echo "Number of directories: $dirs"
echo "Total number of messages: $msgs"

Executando o script, chamado dirfiles , no meu diretório inicial:

$ ./dirfiles ~
Number of directories: 27
Total number of messages: 8703

E em /usr/lib :

$ ./dirfiles /usr/lib
Number of directories: 161
Total number of messages: 9630

Além disso, find oferece três maneiras de resolver links simbólicos:

  • -P : não segue links simbólicos
  • -L : siga os links simbólicos
  • -H : não segue links simbólicos, exceto quando processa argumentos de linha de comando.

Se você não quer seguir links simbólicos, mas $ARCHIVE é um, então talvez -H seja o caminho a percorrer.

    
por ladaghini 16.10.2013 / 17:44
1

Isso acontece porque provavelmente você não tem permissões de leitura no diretório de outra pessoa. Se você não tiver permissões de leitura, não poderá visualizar / pesquisar / encontrar qualquer conteúdo. Você pode verificar isso com o seguinte comando:

ls -l /home/username/directory

Verifique também se esses arquivos ou diretórios para os quais você pesquisa são realmente arquivos ou diretórios (o primeiro caractere da permissão de cadeia de 10 caracteres é - ou d , não é outra coisa - l no seu caso que significa links simbólicos).

  

ls mostra permissões como uma cadeia de 10 caracteres, por exemplo, -rw-r--r-- . Os caracteres podem ser interpretados como TUUUGGGOOO em que:

T Type
UUU   Rights for the owner of the file
GGG   Rights for users in the group
OOO   Rights for others, not listed above
     

T é um dos seguintes:

- file
d directory
c character device
b block device
l symbolic link

Fonte: Introdução às permissões de arquivos do Unix

Além disso, quando você usa:

  • find -type d - você pesquisa apenas por diretórios.
  • find -type f - você pesquisa apenas por arquivos regulares.
por Radu Rădeanu 16.10.2013 / 17:08