2009-10-19 22 views
10

* joker karakterinin (kendiliğinden), "geçerli klasördeki tüm gizli olmayan dosyalar" anlamına geleceği ve bir dosya tarafından önceden gizlenen dosyaların olduğu gibi genişleyeceğini anlıyorum.Bash globbing - birkaç özel durum için autoexpand?

ben yararlıdır düşünürdüm iki kullanım örneği vardır, ama düzgün nasıl yapılacağını bilmiyorum:

  1. nasıl geçerli klasördeki için ... "Tüm dosyaları topak olabilir, gizli dosyalar dahil, ancak . veya .. dahil değil "?

  2. Nasıl ... "Geçerli klasördeki tüm gizli dosyalar (ve yalnızca gizli dosyalar), ancak . veya .. dahil"?

cevap

15

paviums answer genişletmek ve sorunun ikinci kısmını cevaplamak için . ve .. dışındaki tüm dosyaları bu gibi belirtilebilir olabilir:

{.[!.]*,*} 

o dotglob ayarlamak için daha iyi olabilir tam kullanım durumuna bağlı olarak o bash varsayılan olarak * ait açılımları içinde dotfiles içerir böylece kabuk seçeneği:

$ shopt -s dotglob 
$ echo * 
.tst 
+2

'{..? * ,. [^.] *, [^.] *}' Dotglob ayarından bağımsız olarak çalışır ve iki noktadan başlayan eksik dosya isimlerini önler, burada herkes kaçırmış gibi görünüyor. – ephemient

+1

@ephemient: Bu bana iki noktadan başlayan dosya isimleri olmadığında sahte bir eşleşme oluşturuyor. –

3

Bash Cookbook, 2. gereksiniminize bir çözüm önerir. 'Dot dosyaları' belirterek ancak Tabii . ve ..

kaçınmanın bir yolu olarak

.[!.]* 

, ls -A seçeneği vardır, ama bu globbing değil.

+2

'dokunmatik ..blah; echo {.,} [!.] * | grep blah başarısız. – ephemient

1

ilk vaka karşılamak için:

echo {.,}[^.]* 

veya

echo {.,}[!.]* 

Düzenleme:

Bu seferki her şeyi elde gibi görünüyor, ama "tüm dosyalar" ile daha kısa ephemient 'ın

echo {.*,}[^.]* 
+2

'dokunma ..blah; echo {.,} [^.] * | grep blah başarısız. – ephemient

0

olduğunu ve "tüm gizli dosyalar", sadece dosyaları mı kastediyorsunuz, yoksa her iki f'yi mi kastediyorsunuz? iles ve dizinleri? Globbing, bir dosyaya veya dizine ait olup olmadığına bakılmaksızın isimler üzerinde çalışır. Diğer insanlar gizli vs gizli olmayan isimleri bulmak için globbing kullanmak için iyi yanıtlar verir, ancak türleri arasında ayırt edebilirsiniz kolay bir alternatif olarak find komutu çevirmek isteyebilirsiniz.

"Gizli dosya dahil olmak üzere ancak dahil ya da değil, Geçerli klasördeki tüm dosyaları .." bulmak için:

find . -type f 

gizli dosyalar dahil, geçerli klasördeki "Tüm dosya ve dizinleri bulmak için, ama dahil değil.":

find . ! -name . 

" Tüm gizli dosyaları (yalnızca gizli dosyaları) geçerli klasörde bulmak, ancak dahil etmemek. ya ..: Tüm gizli dosyaları ve dizinleri (ve sadece gizli dosyaları ve dizinleri) geçerli klasörde, ancak dahil değil "

find . -name '.*' -type f 

bulmak için". ya .. ":

yalnızca geçerli dizine sınırlamak isterseniz kullanabilirsiniz, böylece varsayılan olarak bulmak da Alt dizinleri recurse olacaktır Not olduğunu
find . -name '.*' ! -name . 

:

find . -maxdepth 1 -type f 
1

STH birleştiren ve pavium bu eski olmasına rağmen Yani

# dot files but avoiding . and .. 
.[!.]* 

# all files but avoiding . and .. 
{.[!.]*,*} 
0

cevaplar - shopt kullanmadan, bu cevaplar olarak verilmiştir ne genişleyen, tam cevaplanmış görünüyor Ama gelmez şimdiye kadar, benim için bu işi.

1:

{*,.[!.]*,..?*}

2:

{.[!.]*,..?*}