Faz loop através de arquivos, excluindo diretórios

9

Eu preciso do meu script para fazer algo em cada arquivo no diretório atual, excluindo quaisquer subdiretórios.

Por exemplo, no caminho atual, existem 5 arquivos, mas 1 deles é uma pasta (um subdiretório). Meu script deve ativar um comando dado como argumentos ao executar o script. Ou seja "bash script wc -w" deve fornecer a contagem de palavras de cada arquivo no diretório atual, mas não em nenhuma das pastas, para que a saída nunca tenha nenhuma das linhas "/ sub / dir: É um diretório".

Meu script atual:

#!/bin/bash
dir='pwd'
for file in $dir/*
do
    $* $file
done

Eu só preciso excluir diretórios para o loop, mas não sei como.

    
por Tõnis Piip 13.03.2017 / 19:28

3 respostas

6
#!/bin/bash -

for file in "$dir"/*
do
  if [ ! -d "$file" ]; then
      "$@" "$file"
  fi
done

Note que ele também exclui arquivos que são do tipo symlink e onde o symlink resolve um arquivo do tipo directory (que é provavelmente o que você quer).

Alternativa (dos comentários), verifique apenas os arquivos:

for file in "$dir"/*
do
  if [ -f "$file" ]; then
      "$@" "$file"
  fi
done
    
por 13.03.2017 / 19:31
3

Aqui está uma alternativa para usar um loop for se o que você precisa fazer é simples (e não envolve variáveis de configuração no shell principal & c).

Você pode usar find com -exec e usar -maxdepth 1 para evitar recursão no subdiretório.

[ -n "$1" ] && find "$dir" -type f -mindepth 1 -maxdepth 1 -exec "$@" "{}" \;

O [ -n "$1" ] está lá para evitar a execução de todos os arquivos no diretório quando o script não recebe nenhum argumento.

    
por 13.03.2017 / 21:40
2

Em zsh, você pode usar os qualificadores para restringir correspondências curinga por tipo de arquivo . Por exemplo, adicionar (.) após o padrão restringe-o a arquivos regulares.

wc -w *(.)

Para lidar com nomes de arquivos que começam com - ou . , use wc -c -- *(.N) ou wc -c ./*(.N) . Se você quiser incluir links simbólicos para arquivos regulares, faça isso *(-.) .

Os outros shells comuns não possuem esse recurso, portanto, é necessário usar algum mecanismo diferente para filtrar por arquivo, como o teste de tipos de arquivo em um loop ou find .

    
por 14.03.2017 / 02:20

Tags