Yanıtlar:
Komuta :
ls -ld .?*
Sadece gizli dosyaları listeler.
Açıklamak :
-l use a long listing format
-d, --directory
list directory entries instead of contents, and do not derefer‐
ence symbolic links
.?* will only state hidden files
.ve ..maçtan çıkarmak . Ancak aynı zamanda gibi (tamamen yasal) tek karakterlik gizli dosya hariç tutar .a, .1böylece ve. Muhtemelen daha iyi bir uzatılmış glob .!(|.)yani değişmez nokta, ardından hiçbir şey veya başka bir şey (tek) noktadan başka bir şey ls -d .!(|.)
ls -d .!(|.)
OP'nin aradığı şeyi yapar.
!(pattern-list), pattern-lista ile ayrılan bir veya daha fazla şablonun bir listesi olduğunu anlıyorum |, ama solunda herhangi bir şablonun olmaması benim için kafa karıştırıcı |. Lütfen bu sözdizimini bana açıklar mısınız?
.hiçbir şey (ya da .) izlemiyor gibiydi . ...
Dosyaları sadece geçerli dizinde istiyorsan (özyineleme yok), yapabilirsin
echo .[^.]*
Bu, adı a ile başlayan .ve ardından bir veya daha fazla nokta olmayan karakter olan tüm dosyaların adlarını yazdıracaktır . Bunun, ardışık noktalar ile başlayan dosyalar için başarısız olacağını, bu nedenle örneğin ....foogösterilmeyeceğini unutmayın.
Ayrıca findşunları da kullanabilirsiniz :
find -mindepth 1 -prune -name '.*'
-mindepthBiz eşleşmeyen olmasını sağlar .ve -prunearaçlar findalt dizinleri içine inerler olmayacaktır.
Kullanılması findve awk,
find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
Açıklama:
find . -type f -> Geçerli dizindeki tüm dosyaları yolunun yanında göster,
./foo.html
./bar.html
./.foo1
awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
/alan ayırıcı awk, noktayla başlayan veya olmayan son alanı kontrol eder. Bir nokta ile başlıyorsa, o zaman karşılık gelen çizginin son alanını yazdırır.
find -type f. Arama yolunu açıkça ayarlamanıza gerek yoktur veya -name "*".
find genellikle karmaşık aramalar için isimlendirme kullanmaktan daha iyi bir seçenektir.
find . -mindepth 1 -maxdepth 1 -name '.*'
veya
find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'
find . geçerli dizini arar
-mindepth 1hariçtir. ve .. listeden
-maxdepth 1 aramayı geçerli dizine sınırlar
-name '.*' nokta ile başlayan dosya adlarını bulma
-o veya
-name '*~' tilde ile biten dosya adlarını bulma (genellikle, bunlar metin düzenleme programlarından gelen yedek dosyalardır)
Ancak, bu ve diğer cevapların tümü, geçerli yönetmenin .hiddendosyasındaki dosyaları özlüyor . Bir komut dosyası yazıyorsanız, bu satırlar .hiddendosyayı okuyacak ve var olanların dosya adlarını görüntüler.
if [[ -f .hidden]] # if '.hidden' exists and is a file
then
while read filename # read file name from line
do
if [[ -e "$filename" ]] # if the read file name exists
then
echo "$filename" # print it
fi
done < .hidden # read from .hidden file
fi
.hiddendosya? Neden hiç .hiddendosya isimlerini içeren bir dosya olsun ki? Neyse, bir tane varsa, neden tek ihtiyacın olursa olsun, o kadar karmaşık bir şey yapardın cat .hidden? Sizin findkomut doğru (imsi) ama -name '*~'alakasız. Tildes ile biten dosyalar yedekleme dosyalarıdır ancak hiçbir şekilde gizli değildir.
.hiddenDosya, nokta / nokta ile başlamak üzere dosya / klasör adını değiştiremediğinizde gizlemek istediğiniz dosya ve klasörler içindir. Tildes biten dosyalar gelince, sisteme bağlıdır. ls -BGUI dosya araştırıcılarının çoğunda olduğu gibi bu dosyaları yok sayar.
cat .hidden.hiddendosyaya eklendiğinden bu yana silinmiş veya taşınmışsa artık bulunmayan dosyaları gösterebilir .
Aşağıdaki komutu kullanarak yapabileceğinizi düşünüyorum.
ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
ls -a girdiğiniz komut, geçerli çalışma dizinindeki tüm dosyaları ve dizinleri gösterir.
grep "^\."Ben ekledim komutu, çıktıyı yalnızca gizli dosyaları gösterecek şekilde filtreledi (adı ile başlar ".").
grep -v "^\.$" | grep -v "^\..$" komutunu ekledim, çıktıyı filtrelemek için çıktı., .. (Geçerli ve üst dizindirler).
Bazı dosya adlarının satırdan daha fazlasına sahip olması durumunda "\n", yukarıdaki örnek yanlış olabilir.
Bu yüzden sorunu çözmek için aşağıdaki komutu tavsiye ederim.
find -maxdepth 1 -name ".[!.]*"
ls .
Başka ne yapabilirdin, is ls .?*ya da ls .!(|)şu anki dir içindeki her şeyi gösterir.
örneğin: terminalimden
$ ls .?*
.bash_history .dmrc .macromedia .weather
.bash_logout .gksu.lock .profile .wgetrc
.bash_profile .bashrc.save .ICEauthority .toprc .Xauthority
.bashrc .lastdir .viminfo .xsession-errors
.bashrc~ .dircolors .lynxrc .vimrc .xsession-errors.old
..:
Baron
.adobe:
Flash_Player
.aptitude:
cache config
.cache:
compizconfig-1 rhythmbox
dconf shotwell
Şimdi yukarıdaki sonuçlara dikkat edin, alt dizinindeki her dosya / dizini ve altındaki tüm gizli dosyaları gösterir.
[1:0:248][ebaron@37signals:pts/4][~/Desktop]
$ ls .!(|)
.bash_aliases .bashrc1 .bashrc1~
..:
askapache-bash-profile.txt examples.desktop Public top-1m.csv
backups Firefox_wallpaper.png PycharmProjects top-1m.csv.zip
Desktop java_error_in_PYCHARM_17581.log Shotwell Import Log.txt topsites.txt
Documents Music Templates Videos
Downloads Pictures texput.log vmware
Üzgünüm, yorum yapamam. arasındaki farkı burada açıklamak ls .?*ve cioby23 cevap @ ls -d .[!.]* .??*Ve aslında iki kez gizli dosyaları baskı anlamıyla iki kez soruyorsun çünkü neden .??*, .?*, .[!.]*bu kadar iki kez yazdırılır farklı komut karakterleri ile bunlardan herhangi ekleyerek, aynı şey.
Şimdiye kadarki tüm cevaplar, nokta ile başlayan isimlerin (veya dizinlerin) "gizli" olduğu gerçeğine dayanıyor. Bu kadar verimli olmayabilir, ancak başka bir çözüm buldum, ancak bu çözüm gizli dosyaların isimleri hakkında hiçbir şey kabul etmiyor ve bu nedenle ..sonuçta listelenmekten kaçınıyor (şu anda kabul edilen cevapta olduğu gibi).
Tam komut şudur:
ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)
açıklama
Bunun yaptığı şey tüm dosyaları (ve dizinleri) iki kere listelemek.
echo -e "$(\ls)\n$(\ls -A)"
ancak yalnızca bir kez gizli dosyalar gösteriliyor -A.
Sonra | sortsırayla (gizli) dosyaların iki kez ve yan yana görünmesini sağlayan liste sıralanır .
Ardından, | uniq -uyalnızca benzersiz çizgiler bırakarak birden fazla görünen tüm satırları kaldırın .
Sonunda, lstüm dosyaları kullanıcının özel seçenekleriyle ve listedeki dizinlerin içeriğini listelemeden listelemek için tekrar kullanın -d.
EDIT (Sınırlamalar):
Muru belirttiği gibi, bu çözüm gibi isimlerle dosyalar varsa doğru çalışmaz escaped\ncharacter.txtçünkü echo -eiki hat halinde dosya bölünmüş olacaktır. Aynı zamanda gibi özel bir karakter hariç neredeyse aynı ada sahip iki gizli dosyaları varsa beklendiği gibi çalışmaz .foo[tab].txtve .foo[new-line].txtbunların her ikisi olarak yazdırılır olarak .foo?.txtve tarafından ortadan kalkacağıuniq -u
.ilk karakterle başa çıkmak için bir hatadan kaynaklanıyor .
.., ama özel karakterler içeren dosya isimlerinde ne kadar iyi çalıştığını merak ediyorum.
echo -eyorumlayacak olan kaçış dizileri yoktur . Ayrıca: lsiki farklı dosya adının aynı şekilde görünmesi için dosya adlarını daraltamaz (örneğin, bazı sürümlerde özel karakterler için lskullanılır ?, bu nedenle .foo\tbar( \t=> sekmesi) ve .foo\nbar( \n=> newline) her ikisi de görünür foo?bar.
Alternatif olarak, kullanabilirsiniz echo .*
Örneğin
user@linux:~$ echo .*
. .. .bash_aliases .bash_history .bash_logout .bashrc
user@linux:~$
Uzun liste biçiminde tercih ederseniz, beyaz boşluğu yeni bir satıra dönüştürmeniz yeterlidir.
user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$
Bash ile, GLOBIGNOREözel değişkeni ayarlamak boş olmayan bir değerdir, yoksaymak için .ve ..globları genişletmek için yeterlidir . Gönderen Bash docs :
GLOBIGNOREKabuk değişkeni bir desen eşleştirme dosya isimleri kümesini kısıtlamak için kullanılabilir. EğerGLOBIGNOREayarlanır, aynı zamanda modellerden biriyle eşleşen her eşleşen dosya adıGLOBIGNOREmaçları listesinden kaldırılır. Eğernocaseglobseçenek ayarlanırsa, desen karşı eşleştirme içindeGLOBIGNOREharf duyarlılığı olmadan gerçekleştirilir. Dosya adları.ve ayarlandığında boş olan ve..her zaman yoksayılırGLOBIGNORE. Bununla birlikte,GLOBIGNOREboş olmayan bir değere ayarlanması , dotglob kabuk seçeneğini etkinleştirme etkisine sahiptir, bu nedenle‘.' ile başlayan diğer tüm dosya adları eşleşecektir.
Biz bunu ayarlarsanız .:.., hem .ve ..göz ardı edilecektir. Null olmayan bir şeye ayarlamak bu davranışı da alacağına göre, tam olarak.
Yani:
GLOBIGNORE=.
ls -d .*
ls -ld .*veyals -ald .*işe yarayacak