Problemas neste script:
- Você está analisando a saída de
ls
. Não analisels
. - Você está confiando em nomes de arquivos para não conter espaços ou novas linhas. Eles podem conter um dos dois
- Você está usando
csh
. Por si só, essa é uma má idéia para scripts de shell. Bash, Ksh, Zsh, quase qualquer coisa mascsh
é uma ideia melhor. (Minha opinião, mas leia o raciocínio factual vinculado).
Aqui está uma versão compatível com POSIX de parte deste programa. (Se eu tiver tempo depois, posso incluir o restante dos recursos.)
Isto não irá lidar com casos em que haja mais arquivos do que os que se encaixam em uma lista de argumentos, mas pode ser modificado para fazer isso se realmente for necessário.
#!/bin/sh
[ "$#" -eq 1 ] && [ -d "$1" ] || {
printf 'Usage:\t%s <directory>\n' "$0"
exit 1
}
dirs="$(find "$1" -path '*/*/*' -prune -o -type d -exec sh -c 'printf %s\n "$#"' sh {} +)"
files="$(find "$1" -path '*/*/*' -prune -o -type f -exec sh -c 'printf %s\n "$#"' sh {} +)"
printf 'Number of directories in %s:\t%s\n' "$1" "$dirs"
printf 'Number of files in %s:\t%s\n' "$1" "$files"
Como o -maxdepth
primary não é portátil, usei as técnicas descritas aqui: