Script de shell com entrada de diretório

1

Estou escrevendo um script de shell que deve receber um parâmetro (um nome de diretório) e exibir quantos arquivos, diretórios, arquivos legíveis, arquivos graváveis e arquivos executáveis estão nesse diretório. Se um parâmetro não é dado quando você o executa, ele deve exibir uma mensagem de erro e abortar. Se o parâmetro fornecido não existir, ele também deverá exibir uma mensagem de erro e abortar. Caso contrário, deve exibir as informações acima. Eu não posso para a vida de mim fazê-lo funcionar. Aqui está o que eu tenho, por favor ajude!:

   #!/bin/csh
   $1
   set file=$1
       if ($file==0)then
             echo "usage: assignment6.sh <directory_name>"
             exit0
       else
           if (-e $file && -r $file) then
                echo "Number of Directories: 'ls | wc -w'"
                echo "Number of Files: 'ls -d */ | wc -w'"
                echo "Number of Readable files: 'find * -type f -or -type d -maxdepth 0 -perm +u=r | wc -w'"
                echo "Number of Writable files: 'find * -type f -or -type d -maxdepth 0 -perm +u=w | wc -w'"
                echo "Number of Executable files: 'find * -type f -or -type d -maxdepth 0 -perm +u=x | wc -w'"

            else
                if (! -e $file) echo "No such directory."
                exit 0
            endif
       endif
 exit 0
    
por Maddie 18.11.2016 / 22:36

1 resposta

2

Problemas neste script:

  1. Você está analisando a saída de ls . Não analise ls .
  2. Você está confiando em nomes de arquivos para não conter espaços ou novas linhas. Eles podem conter um dos dois
  3. Você está usando csh . Por si só, essa é uma má idéia para scripts de shell. Bash, Ksh, Zsh, quase qualquer coisa mas csh é 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:

por 18.11.2016 / 23:48