Terminal'de sadece gizli dosyalar nasıl gösterilir?


154

Binlerce dosya içeren bir dizin var, bir kısmı gizli.

Komut ls -a, gizli dosyalar dahil tüm dosyaları listeler, ancak yalnızca gizli dosyaları listelemeye ihtiyacım var.

Hangi komutu kullanmalıyım?


1
Basit ls -ld .*veya ls -ald .*işe yarayacak
John Strood

Yanıtlar:


189

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 

8
Buradaki iki soru işaretine ihtiyacınız yoktur, * bunu kapsar (? Sadece herhangi bir karakterle eşleşir, * herhangi bir sayı ile eşleşir).
psusi

13
@ psusi, bence amacım maç dışı bırakmak .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 .!(|.)
olmayacaktı

@ steeldriver, temiz, ?? sürüm "." hariçtir ve "..". Bu ilginç bir tuhaflığın sonucu gibi görünüyor: ne? nor * bir nokta ile eşleşir, ama? Aksi takdirde birşeyle eşleşmeli , isim yoksayılır.
psusi

Dizinleri ve dosyaları tanımlamak için F seçeneğini ekleyin; yani, ls -ldF.? *
RCF

1
Bu da neredeyse bir işe yaramazsa, burada bir dosya değil. Ben biraz -slp gibi değiştiririm.? * | grep -v / Bu sadece liste gizli dosyalar gizli klasör değil
Fred Yang

31
ls -d .!(|.)

OP'nin aradığı şeyi yapar.


1
Bu nasıl çalışıyor?
SarcasticSully

Bir şey ile dizin listesi. ve bir olmadan hiçbir şeyi listelemeyin, onun hemen hemen ne çevirdiğidir.
Patrick

1
Bunun içinde !(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?
Carlos Mendoza

2
@CarlosMendoza boş bir kalıp haline gelecekti, bu yüzden kendisini ve dışında .hiçbir şey (ya da .) izlemiyor gibiydi . ...
muru

16

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.



4

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.


Sadece kullanabilirsin find -type f. Arama yolunu açıkça ayarlamanıza gerek yoktur veya -name "*".
terdon

3

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

Ne var .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.
terdon

@terdon .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.
Mark H

cat .hidden.hiddendosyaya eklendiğinden bu yana silinmiş veya taşınmışsa artık bulunmayan dosyaları gösterebilir .
Mark H

Bu iyi çalışıyor.
Penghe Geng,

2

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 ".[!.]*"


@ RaduRădeanu Yorumunuzu gördüm, Çok iyi. Cevabımı tekrar düzenledim. Yorumunuz için teşekkür ederiz.
xiaodongjie

2

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.


1

Ayrıca kullanabilirsin:

ls -d .[!.]* .??*

Bu, normal gizli dosyaları ve 2 veya 3 noktayla başlayan gizli dosyaları görüntülemenizi sağlar: ..hidden_file


1
Bununla tüm gizli dosyaları iki kez alıyorum.
TuKsn

1

komutu kullanabilirsiniz

ls -Ad .??*

Bu, ls -a | grep "^\."çözümlerde grep tabanlı yaklaşımın aksine, çok sütunlu listeye izin verme avantajına sahiptir


1

Ş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


1
Sanırım bu gizli dosyaların tanımı. Bu gizli dosyaların kaynağı bile .ilk karakterle başa çıkmak için bir hatadan kaynaklanıyor .
muru

İlk paragrafta bunu (gerçek olarak) söz ediyorum. Yine de mevcut cevaplardan farklı bir sonuç alıyor
alejandro

Elbette hariç .., ama özel karakterler içeren dosya isimlerinde ne kadar iyi çalıştığını merak ediyorum.
muru

Özel karakterlerle ne demek istediğinizi tam olarak bilmiyorum, ama bu çözüm dosya isimleri hakkında hiçbir şey varsaymadığından bir sorun çıkarmayacağını düşünürdüm
alejandro

Aslında, en az bir şey olduğunu varsayıyorsunuz: dosya isimlerinde yeni satırlar yok. Ayrıca: dosya isimlerinde 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.
muru

1

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:~$ 

0

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ğer GLOBIGNOREayarlanır, aynı zamanda modellerden biriyle eşleşen her eşleşen dosya adı GLOBIGNOREmaçları listesinden kaldırılır. Eğer nocaseglobseçenek ayarlanırsa, desen karşı eşleştirme içinde GLOBIGNOREharf duyarlılığı olmadan gerçekleştirilir. Dosya adları .ve ayarlandığında boş olan ve ..her zaman yoksayılır GLOBIGNORE. 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 .*
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.