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
, .1
bö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-list
a 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 ....foo
gösterilmeyeceğini unutmayın.
Ayrıca find
şunları da kullanabilirsiniz :
find -mindepth 1 -prune -name '.*'
-mindepth
Biz eşleşmeyen olmasını sağlar .
ve -prune
araçlar find
alt dizinleri içine inerler olmayacaktır.
Kullanılması find
ve 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 1
hariç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 .hidden
dosyasındaki dosyaları özlüyor . Bir komut dosyası yazıyorsanız, bu satırlar .hidden
dosyayı 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
.hidden
dosya? Neden hiç .hidden
dosya 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 find
komut doğru (imsi) ama -name '*~'
alakasız. Tildes ile biten dosyalar yedekleme dosyalarıdır ancak hiçbir şekilde gizli değildir.
.hidden
Dosya, 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 -B
GUI dosya araştırıcılarının çoğunda olduğu gibi bu dosyaları yok sayar.
cat .hidden
.hidden
dosyaya 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 | sort
sırayla (gizli) dosyaların iki kez ve yan yana görünmesini sağlayan liste sıralanır .
Ardından, | uniq -u
yalnızca benzersiz çizgiler bırakarak birden fazla görünen tüm satırları kaldırın .
Sonunda, ls
tü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 -e
iki 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].txt
ve .foo[new-line].txt
bunların her ikisi olarak yazdırılır olarak .foo?.txt
ve 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 -e
yorumlayacak olan kaçış dizileri yoktur . Ayrıca: ls
iki 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 ls
kullanı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 :
GLOBIGNORE
Kabuk değişkeni bir desen eşleştirme dosya isimleri kümesini kısıtlamak için kullanılabilir. EğerGLOBIGNORE
ayarlanır, aynı zamanda modellerden biriyle eşleşen her eşleşen dosya adıGLOBIGNORE
maçları listesinden kaldırılır. Eğernocaseglob
seçenek ayarlanırsa, desen karşı eşleştirme içindeGLOBIGNORE
harf duyarlılığı olmadan gerçekleştirilir. Dosya adları.
ve ayarlandığında boş olan ve..
her zaman yoksayılırGLOBIGNORE
. Bununla birlikte,GLOBIGNORE
boş 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