como iterar através de arquivos no diretório, excluindo arquivos ocultos

0

Usando:

for eachfile in /mnt/thara/*

Que também percorre arquivos ocultos. Eu não preciso de arquivos ocultos.

    
por Thara Savio 10.06.2016 / 18:08

5 respostas

3

O comportamento normal do bash é não olhar para os arquivos ocultos ao usar para. Mas esse comportamento pode ser alterado com o comando shopt.

Para ativar a verificação de arquivos ocultos com "*":

shopt -s dotglob

Para desativar a verificação de arquivos ocultos com "*" (comportamento padrão)

shopt -u dotglob

Então, tente um script como este:

shopt -u dotglob
for eachfile in /mnt/thara/*

E agora os arquivos ocultos devem desaparecer.

    
por 10.06.2016 / 18:41
2

Outra maneira é

for eachfile in /mnt/thara/[^.]*
    
por 10.06.2016 / 21:12
1

Concordo com o comentário sobre a opção dotglob shell. Se não estiver definido, o comportamento do loop for é o esperado:

utente@computer:/tmp/test$ shopt | grep dotglob
dotglob         off

Deixe a , b e c serem arquivos normais; .hidden1 e .hidden2 arquivos ocultos:

utente@computer:/tmp/test$ touch a b c .hidden1 .hidden2

utente@computer:/tmp/test$ ls -al
totale 8
drwxrwxr-x  2 utente utente 4096 giu 10 18:28 .
drwxrwxrwt 13 root   root   4096 giu 10 18:28 ..
-rw-rw-r--  1 utente utente    0 giu 10 18:28 a
-rw-rw-r--  1 utente utente    0 giu 10 18:28 b
-rw-rw-r--  1 utente utente    0 giu 10 18:28 c
-rw-rw-r--  1 utente utente    0 giu 10 18:28 .hidden1
-rw-rw-r--  1 utente utente    0 giu 10 18:28 .hidden2

Para loop:

utente@computer:/tmp/test$ for eachfile in * ; do ls $eachfile ; done

a
b
c

Outra maneira, independente das opções de shell: vamos instruir find para filtrar todos os nomes de caminho cujos caracteres iniciais correspondem ao ponto . :

utente@computer:/tmp/test$ find . \( ! -path '*/.*' \) -type f  -exec ls {} \;

./c
./b
./a

Veja também esta pergunta em superuser.com

    
por 10.06.2016 / 18:39
0

você pode usar o comando find da seguinte forma:

for file in $(find /mnt/thara/ -type f \( ! -iname ".*" \)) ; do ---something $file--- ; done'
    
por 10.06.2016 / 19:41
0

Ou muito simplesmente ..

ls -l | egrep -v "^\."

ou para iterar todos os diretórios que exibem nomes de arquivos:

ls -R | egrep -v "^\."
    
por 10.06.2016 / 21:11