Criando um contador de arquivos que inclui arquivos ocultos

1

Como parte de uma tarefa de programação, eu preciso criar uma parte do código que contará o número de arquivos e diretórios (incluindo ocultos) recursivamente. Eu não tenho permissão para usar os comandos -R , find ou du .

Eu entendo que posso usar:

listAllFiles() {
local dir=$1
local file
directoryCounter=0
fileCounter=0
hiddenFileCounter=0
hiddenDirectoryCounter=0

for file in "$dir"/*; do
    if [[ -d $file ]]; then
        listAllFiles "$file"
        directoryCounter+=1
    else if [[ -f $file ]]
        fileCounter+=1
   else if [[hidden directory]]
        hiddenDirectoryCounter+=1
   else if [[hiddenfile]]
        hiddenFileCounter+=1
    fi
done}

Existe uma maneira de incluir arquivos e diretórios ocultos nessa declaração if if.

    
por Joshua Twaites 22.11.2013 / 22:31

3 respostas

3

Em bash , a maneira mais fácil é executar shopt -s dotglob , que informará bash para incluir arquivos ocultos em globs.

Se você não quiser fazer isso (por exemplo, usando um shell sem esse recurso), basta usar os seguintes globs: .[!.]* ..?* * . A complexidade aparentemente é evitar corresponder . e .. . O primeiro glob corresponde a arquivos ocultos com mais de dois caracteres que começam com . , mas não .. . O segundo corresponde a arquivos ocultos de 3 ou mais caracteres que começam com .. . O último é o glob normal para arquivos não ocultos.

Is there a way for me to include hidden files and directories in this else if statement.

Na verdade, é a declaração for que você deveria estar vendo. Tudo o que você precisa fazer é alterar "$dir"/* para incluir também os outros 2 padrões glob descritos acima.

    
por 22.11.2013 / 22:44
1

Você poderia algo assim:

shopt -s nullglob
n=0
count() {
  for i in "$1"/* "$1"/.*; do
    if [ "${i##*/}" = . ] || [ "${i##*/}" = .. ] || [ -L "$i" ] || [ ! -d "$i" ]; then
      n=$(($n + 1))
    else
      count "$i"
    fi
  done
}
count .; echo "$n"

O único bashism sendo o comando shopt acima. Ele não detecta loops do sistema de arquivos como find mas, pelo menos, não segue links simbólicos.

    
por 22.11.2013 / 23:19
-3

Bem, isso não é estritamente programação, mas:

$ i=$(ls -al | wc -l); echo $i - 3 | bc

funciona como um campeão!

    
por 23.11.2013 / 00:37