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 fornecido como argumento 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 de 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 do loop, mas não sei como.
if [ -f "$file" ]; then ...
. Um diretório não retornaria apenas arquivos comuns, mas também soquetes e links simbólicos.! -d
.Aqui está uma alternativa para usar um loop for se o que você precisa fazer é simples (e não envolve a definição de variáveis no shell principal etc.).
Você pode usar
find
com-exec
e-maxdepth 1
para evitar recursão no subdiretório.O
[ -n "$1" ]
que há para evitar a execução de todos os arquivos no diretório quando o script não é passado nenhum argumento.fonte
No zsh, você pode usar os qualificadores globais para restringir as correspondências curinga por tipo de arquivo. Por exemplo, adicionar
(.)
após o padrão restringe-o a arquivos regulares.Para lidar com nomes de arquivos que começam com
-
ou.
, usewc -c -- *(.N)
ouwc -c ./*(.N)
. Se você deseja incluir também 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 testar tipos de arquivo em um loop ou
find
.fonte
Bash for loop excluindo subdiretórios ('/') e links (@):
fonte