encontrar diretórios com padrões específicos leva a erro de permissão negada e nenhum resultado

2

Eu tenho esse tipo de script de shell no Linux:

#!/bin/sh
echo -n "Please enter directory pattern: "
read dirs
find $dirs > /tmp/justbay.txt


allDirs=$(find $dirs ! -readable -prune)
echo $allDirs
lines=$($allDirs | wc -l)
echo $lines

if [ $lines -eq 0 ]; then
 echo "Directory not found"
 exit 1
fi

echo $alldirs

Eu sei que posso fazer algo como: >/dev/null 2>&1 , mas essa pergunta não é sobre mensagem de erro, pois parece que a contagem de linhas é sempre 0, não importando se o diretório existe ou não.

    
por Shota 30.05.2015 / 14:13

3 respostas

4

Porque você não pode executar $allDirs . Provavelmente você queria fazer o seguinte:

lines=$(echo "$allDirs" | wc -l)

Mas nesta versão $allDirs é expandida em uma linha, então você sempre obterá 1 para $lines .

A solução mais simples é canalizar a saída de find diretamente para wc :

lines=$(find "$dirs" ! -readable -prune | wc -l)
    
por 30.05.2015 / 14:32
0

Existem dois problemas principais com o seu código.

O primeiro é que o utilitário find não aceita um padrão como seu primeiro argumento, ele usa um único caminho.

Se você deseja iterar em vários diretórios, execute o find em um loop como este:

for dir in $pattern; do
    find $dir ...
done

O segundo é que você tenta executar o conteúdo da variável $allDirs quando você faz $($allDirs | wc -l) . Você provavelmente queria algo como $( echo $allDirs | wc -l ) , dependendo de qual era sua intenção com essa linha em particular.

    
por 30.05.2015 / 16:41
0

Existem 3 problemas com o seu script.

  1. Você deve usar a opção -name
  2. Em vez de salvar a lista de diretórios em uma variável e, em seguida, executar wc -l mais tarde, faça uma etapa conforme sugerido por @yaegashi.
  3. Quando você deseja echo a variável $alldirs , use quotes para que os * nos nomes de diretório não sejam expandidos.

Então, o seu comando find acoplado a wc seria algo como isto:

find -name "*$dir*" ! -readable -prune 2>/dev/null | wc -l

Isso deve funcionar bem, mesmo para diretórios que tenham um asterisco ( * ) em seus nomes.

Seu script final seria algo como:

#!/bin/sh
echo -n "Please enter directory pattern: "
read dirs
find $dirs > /tmp/justbay.txt

$alldirs=$(find -name "*$dir*" ! -readable -prune 2>/dev/null)
$lines=$(find -name "*$dir*" ! -readable -prune 2>/dev/null | wc -l)

if [ $lines -eq 0 ]; then
 echo "Directory not found"
 exit 1
fi

echo "$alldirs" #Quoting is important, otherwise the asterisk may get expanded
    
por 31.05.2015 / 09:38

Tags