Eu tenho uma pasta com alguns diretórios e alguns arquivos (alguns estão ocultos, começando com ponto).
for d in *; do
echo $d
done
irá percorrer todos os arquivos, mas eu quero percorrer apenas os diretórios. Como faço isso?
Você pode especificar uma barra no final para corresponder apenas aos diretórios:
for d in */ ; do
echo "$d"
done
[[ -L $d ]]
se $ d é um link simbólico.set -P
afeta apenas comandos que alteram o diretório. sprunge.us/TNac[[ -L "$f" ]]
não excluir links simbólicos neste caso com*/
, você tem que tirar a barra final com[[ -L "${f%/}" ]]
(veja Testar link com barra invertida )Você pode testar com
-d
:Este é um dos operadores de teste de arquivo .
fonte
if [[ -d "$f" && ! -L "$f" ]]
excluirá links simbólicosif [[ "$f" = "*" ]]; then continue; fi
Cuidado que a solução do choroba, embora elegante, pode provocar um comportamento inesperado se nenhum diretório estiver disponível no diretório atual. Nesse estado, em vez de pular o
for
loop, o bash executará o loop exatamente uma vez onded
for igual a*/
:Eu recomendo usar o seguinte para proteger contra este caso:
Esse código percorrerá todos os arquivos no diretório atual, verificará se
f
é um diretório e ecoaráf
se a condição retornar verdadeira. Sef
for igual a*/
,echo $f
não será executado.fonte
shopt -s nullglob
.Se você precisar selecionar arquivos mais específicos do que apenas os diretórios usam
find
e passá-los parawhile read
:Use
shopt -u dotglob
para excluir diretórios ocultos (ousetopt dotglob
/unsetopt dotglob
no zsh).IFS=
para evitar a divisão de nomes de arquivos que contenham um dos$IFS
, por exemplo:'a b'
veja a resposta do AsymLabs abaixo para mais
find
opçõesedit:
Caso você precise criar um valor de saída a partir do loop while, é possível contornar o subshell extra com este truque:
fonte
Você pode usar o bash puro para isso, mas é melhor usar o find:
(encontrar adicionalmente incluirá diretórios ocultos)
fonte
shopt -s dotglob
parabash
incluir diretórios ocultos. O seu também incluirá.
. Observe também que-maxdepth
não é uma opção padrão (-prune
é).dotglob
opção é interessante, masdotglob
só se aplica ao uso de*
.find .
incluirá sempre diretórios ocultos (eo dir atual, bem)Isso é feito para localizar os diretórios visíveis e ocultos no atual diretório de trabalho, excluindo o diretório raiz:
apenas percorrer os diretórios:
para incluir links simbólicos no resultado:
para fazer algo em cada diretório (excluindo links simbólicos):
excluir diretórios ocultos:
para executar vários comandos nos valores retornados (um exemplo muito artificial):
em vez de 'sh -c' também pode usar 'bash -c', etc.
fonte
... -print0 | xargs -0 ...
se você não souber quais são os nomes exatos.find * | while read file; do ...
Você pode percorrer todos os diretórios, incluindo os diretórios ocultos (começando com um ponto) em uma linha e vários comandos com:
Se você deseja excluir links simbólicos:
note: o uso da lista
*/ .*/
funciona no bash, mas também exibe as pastas.
e,..
enquanto estiver no zsh, não as mostrará, mas gerará um erro se não houver um arquivo oculto na pastaUma versão mais limpa que incluirá diretórios ocultos e excluirá ../ estará com a opção dotglob:
(ou
setopt dotglob
em zsh)você pode desabilitar o dotglob com
fonte
Isso incluirá o caminho completo em cada diretório da lista:
fonte
Use
find
with-exec
para percorrer os diretórios e chamar uma função na opção exec:Use
shopt -s dotglob
oushopt -u dotglob
para incluir / excluir diretórios ocultosfonte
Isso lista todos os diretórios, juntamente com o número de subdiretórios em um determinado caminho:
fonte
fonte
This
is
one
directory
with
spaces
in
the
name
- mas é analisado como múltiplo.ou:
Você pode configurá-lo como um alias
fonte
ls
da resposta com base nessa lista , que lista os diretórios.ls
: mywiki.wooledge.org/ParsingLs