Existem dois problemas diferentes.
O primeiro é que você não está citando suas variáveis: isso acaba fazendo stat
falhar por esse motivo:
-
search $1 $2 $3
deve ser search "$1" "$2" "$3"
;
-
for elem in $1/*
deve ser for elem in "$1"/*
;
-
owner='stat --format "%s" $1'
deve ser owner='stat --format "%s" "$1"'
;
-
size='stat --format "%U" $1'
deve ser size='stat --format "%U" "$1"'
;
-
search "$elem" $2 $3
deve ser search "$elem" "$2" "$3"
.
O segundo é quando um diretório vazio é alcançado durante a recursão, a expansão de for element in $1/*
falha e os dois comandos stat
são chamados em /path/to/empty/directory/*
, o que não existe:
% bash script.sh /home/user user 0
stat: cannot stat ‘/home/user/Documenti/Musica/*’: No such file or directory
stat: cannot stat ‘/home/user/Documenti/Musica/*’: No such file or directory
stat: cannot stat ‘/home/user/Documenti/My Games/*’: No such file or directory
stat: cannot stat ‘/home/user/Documenti/My Games/*’: No such file or directory
stat: cannot stat ‘/home/user/Documenti/Video/*’: No such file or directory
stat: cannot stat ‘/home/user/Documenti/Video/*’: No such file or directory
stat: cannot stat ‘/home/user/home/user/*’: No such file or directory
stat: cannot stat ‘/home/user/home/user/*’: No such file or directory
stat: cannot stat ‘/home/user/Modelli/*’: No such file or directory
stat: cannot stat ‘/home/user/Modelli/*’: No such file or directory
stat: cannot stat ‘/home/user/Musica/*’: No such file or directory
stat: cannot stat ‘/home/user/Musica/*’: No such file or directory
stat: cannot stat ‘/home/user/Pubblici/*’: No such file or directory
stat: cannot stat ‘/home/user/Pubblici/*’: No such file or directory
stat: cannot stat ‘/home/user/Video/*’: No such file or directory
stat: cannot stat ‘/home/user/Video/*’: No such file or directory
%
Uma maneira de corrigir isso seria verificar se o arquivo / diretório existe antes de chamar display_owner_and_size
, de modo a ignorar a iteração atual se estivermos tentando stat / percorrer um diretório que não existe (já que o diretório está vazio não há razão para stat
seu conteúdo nem para continuar percorrendo esse ramo da árvore):
[ -e "$elem" ] && display_owner_and_size "$elem" || continue
Além disso, outros erros são:
-
owner='stat --format "%s" "$1"'
deve ser owner='stat --format "%U" "$1"'
e size='stat --format "%U" "$1"'
deve ser size='stat --format "%s" "$1"'
;
- Você não pode usar
>
para fazer comparações numéricas. Use -gt
: if [[ $owner == $2 && $size -gt $3 ]]
.
Assim, o script corrigido seria:
#!/bin/bash
owner="valdsilviufarcas"
size=0
function display_owner_and_size()
{
owner='stat --format "%U" "$1"'
size='stat --format "%s" "$1"'
}
function search()
{
for elem in "$1"/*
do
[ -e "$elem" ] && display_owner_and_size "$elem" || continue
if [[ $owner == $2 && $size -gt $3 ]]
then
echo $elem
fi
if test -d "$elem"
then
search "$elem" "$2" "$3"
fi
done
}
search "$1" "$2" "$3"