Existem algumas coisas erradas aqui. Primeiro, você está executando /bin/sh
quando realmente deseja executar /bin/bash
.
Agora, a parte do seu script que verifica arquivos ocultos é
elif [[ -f $file && "$file" == ^. ]]; then
Se você executar seu script como foo.sh /home/foo
, cada $file
começará com /home/foo
, de modo que nem os arquivos ocultos começarão com pontos. Além disso, você não pode usar ^
com ==
, ele corresponde ao início de qualquer maneira (veja aqui ).
De qualquer forma, uma implementação funcional do seu script seria
#!/usr/bin/env bash
shopt -s dotglob
directoryCounter=0
fileCounter=0
hiddenDirectoryCounter=0
hiddenFileCounter=0
listAllFiles()
{
local dir=$1
local file
local bn="$(basename -- "$dir")"
for file in "$dir"/*; do
## Use ..* so you don't count the current dir (.) as hidden
if [[ $bn == .?* ]]; then
let hiddenDirectoryCounter+=1
listAllFiles "$file"
## Match only the filename, not the whole path
elif [[ -f $file && "$(basename "$file")" == .* ]]; then
let hiddenFileCounter+=1
elif [[ -f "$file" ]];then
let fileCounter+=1
elif [[ -d "$file" ]]; then
listAllFiles "$file"
let directoryCounter+=1
fi
done
}
listAllFiles $1
echo File found: $fileCounter
echo Directories found: $directoryCounter
echo Hidden directories found: $hiddenDirectoryCounter
echo Hidden files found: $hiddenFileCounter
No entanto, essa não é uma maneira muito boa de fazer isso, você não pode lidar com mais de um diretório como entrada, e, mais importante, verificar apenas se $bn
é um diretório oculto, nunca $file
, o que significa você nunca encontrará mais de um diretório oculto e estará tornando desnecessariamente complicado. Você poderia simplificar muito usando globstar
. Eu escreveria assim:
#!/usr/bin/env bash
shopt -s dotglob
## globstar causes ** to match all files and directories
## recursively.
shopt -s globstar
for dir in "$@"; do
for file in "$dir"/**; do
if [[ -f $file && "$(basename "$file")" == .* ]]; then
let hiddenFileCounter+=1
elif [[ -d $file && "$(basename "$file")" == .?* ]]; then
let hiddenDirectoryCounter+=1
elif [[ -f $file ]] ; then
let fileCounter+=1
elif [[ -d $file ]] ; then
let directoryCounter+=1
fi
done
done
echo Files found: $fileCounter
echo Directories found: $directoryCounter
echo Hidden directories found: $hiddenDirectoryCounter
echo Hidden files found: $hiddenFileCounter