Verificando todos os arquivos em um 'ls' para loop e exibindo uma mensagem com base em uma condição

3

Eu sou um iniciante em scripts de shell, então peço desculpas se meu código é estranho para alguns de vocês. Eu criei um script que verifica se um determinado diretório existe; se não, então é criado. Em seguida, um loop for é usado para executar todos os arquivos normais e não ocultos no diretório atual. Se um arquivo estiver vazio, avise se o usuário deseja movê-lo. Onde estou preso é que o script, depois de percorrer os arquivos, precisa verificar se todos os arquivos estão vazios e, em seguida, exibe uma mensagem dizendo isso. Aqui está o que eu tenho.

#!/bin/bash
if [ -d Empty_Files ]
then
    echo "This file directory exists already. Move on"
else
    mkdir Empty_Files
    echo "I created the Empty_Files directory since it didn't exist before"
fi

for file in 'ls'
do
 if [ ! -s $file ]
  then
  echo "Would you like" $file "moved to Empty_Files? It's empty! Enter Yes or No"
 read userinput
   if [ $userinput = "Yes" ]
    then 
    mv $file ./Empty_Files
   fi
 if [ $userinput = "No" ]
  then
    echo "Ok, I will not move it!"
 fi
 fi
done
 if [ -s $file ]
   then
     echo "There are no empty files!"
     exit 55
fi

Como você pode ver, minha declaração if no final não funciona totalmente como pretendido.

    
por Spencer Wattamaniuk 08.02.2017 / 18:50

1 resposta

3
  1. Não use backquotes para substituições de comandos (em torno de ls ). Não é muito legível e tem problemas. Se você tiver que usar a saída de outro comando, use $(command args1 args2) form em vez

  2. Não analise ls . Use o shell globbing em vez disso:

    for file in *
    
  3. Cite todas as suas variáveis:

    if [ ! -s "$file" ]
    
  4. exit 55 não é um tipo muito comum para representar erros. Geralmente as pessoas usam exit 1 .

  5. Recue seu código para que fique claro o que cada parte está fazendo e onde cada instrução if começa / termina, onde cada loop começa, termina.

Este é o seu script fixo

#!/bin/bash

if [ -d Empty_Files ]
then
    echo "This file directory exists already. Move on"
else
    mkdir Empty_Files
    echo "I created the Empty_Files directory since it didn't exist before"
fi

count=0
for file in *
do
    if [ ! -s "$file" ]
    then
        count=$(( $count+1  ))
        echo "Would you like" $file "moved to Empty_Files? It's empty! Enter Yes or No"
        read userinput

        if [ "$userinput" = "Yes" ]
        then 
            mv "$file" ./Empty_Files
        fi

        if [ "$userinput" = "No" ]
        then
            echo "Ok, I will not move it!"
        fi
fi
done

# quoting here not necessary because it's integer
if [ $count -eq 0  ];
then
     echo "There are no empty files!"
     exit 1
fi

Execução de teste

[2821][TESTDIR][11:14]:
$ tree
.
├── Empty_Files
└── move_empty.sh

1 directory, 1 file

[2821][TESTDIR][11:14]:
$ ./move_empty.sh                                                                                     
This file directory exists already. Move on
There are no empty files!

[2821][TESTDIR][11:14]:
$ touch empty1 empty2

[2821][TESTDIR][11:14]:
$ ./move_empty.sh                                                                                     
This file directory exists already. Move on
Would you like empty1 moved to Empty_Files? It's empty! Enter Yes or No
Yes
Would you like empty2 moved to Empty_Files? It's empty! Enter Yes or No
No
Ok, I will not move it!

[2821][TESTDIR][11:14]:
$ tree
.
├── empty2
├── Empty_Files
│   └── empty1
└── move_empty.sh

1 directory, 3 files
    
por 08.02.2017 / 19:06