Bagaimana cara hanya menampilkan file tersembunyi di Terminal?

154

Saya memiliki direktori yang berisi ribuan file, beberapa di antaranya tersembunyi.

Perintah ini ls -amencantumkan semua file, termasuk yang tersembunyi, tetapi saya hanya perlu membuat daftar file yang tersembunyi.

Perintah apa yang harus saya gunakan?

nux
sumber
1
Sederhana ls -ld .*atau ls -ald .*akan bekerja
John Strood

Jawaban:

189

Perintah :

ls -ld .?* 

Hanya akan mencantumkan file tersembunyi.

Jelaskan:

 -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 
nux
sumber
8
Anda tidak memerlukan dua tanda tanya di sana, * mencakupnya (? Hanya cocok dengan karakter tunggal apa pun, * cocok dengan sejumlah dari mereka).
psusi
13
@psusi, saya pikir tujuannya adalah untuk mengecualikan .dan ..dari pertandingan. Namun itu juga akan mengecualikan nama file tersembunyi satu karakter (seperti legal) .a, .1dan sebagainya. Mungkin glob yang lebih panjang adalah .!(|.)titik literal diikuti oleh apa pun kecuali titik apa pun (tunggal) yaituls -d .!(|.)
steeldriver
@steeldriver, rapi, ?? versi tidak mengecualikan "." dan "..". Ini tampaknya merupakan hasil dari kekhasan yang menarik: bukan? tidak * akan cocok dengan titik, tetapi? harus cocok dengan sesuatu jika tidak, namanya diabaikan.
psusi
Untuk mengidentifikasi direktori dan file tambahkan opsi F, yaitu, ls -ldF.? * Nama direktori memiliki "/" karena file karakter terakhir yang ditampilkan tidak.
RCF
1
Ini hampir berfungsi kecuali itu juga daftar folder tersembunyi seperti .vim, yang saya anggap bukan file di sini. Saya memodifikasinya sedikit seperti ls -ldp.? * | grep -v / Ini hanya daftar file tersembunyi bukan folder tersembunyi
Fred Yang
31
ls -d .!(|.)

Melakukan persis apa yang dicari OP.

patrick
sumber
1
Bagaimana cara kerjanya?
SarcasticSully
daftar direktori apa saja dengan. dan jangan daftar apa pun tanpa ada yang bisa diterjemahkan.
patrick
1
Saya mengerti bahwa di !(pattern-list), pattern-listadalah daftar satu atau lebih pola yang dipisahkan oleh |, tetapi membingungkan bagi saya bahwa Anda tidak memiliki pola di sebelah kiri |. Bisakah Anda jelaskan sintaks itu kepada saya?
Carlos Mendoza
2
@CarlosMendoza yang akan menjadi pola kosong, jadi ini seperti .tidak diikuti oleh (tidak ada atau .), mengecualikan .dirinya sendiri dan ...
muru
16

Jika Anda hanya ingin file di direktori Anda saat ini (tanpa rekursi), Anda bisa melakukannya

echo .[^.]*

Itu akan mencetak nama semua file yang namanya dimulai dengan a .dan diikuti oleh satu atau lebih karakter non-dot. Perhatikan bahwa ini akan gagal untuk file yang namanya dimulai dengan titik-titik berurutan, jadi misalnya ....footidak akan ditampilkan.

Anda juga bisa menggunakan find:

find -mindepth 1 -prune -name '.*'

The -mindepthmemastikan bahwa kami tidak cocok .dan -pruneberarti bahwa findtidak akan turun ke subdirektori.

terdon
sumber
15
ls -ad .*

bekerja untuk saya di Bash.

Menandai
sumber
Pertunjukan .dan ..di Bash
Penghe Geng
4

Menggunakan finddan awk,

find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

Penjelasan:

find . -type f -> Daftar semua file dalam direktori saat ini bersama dengan jalurnya seperti,

./foo.html
./bar.html
./.foo1

awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

/sebagai pemisah bidang awk memeriksa bidang terakhir yang menatap titik atau tidak. Jika dimulai dengan titik, maka ia mencetak bidang terakhir dari baris yang sesuai.

Avinash Raj
sumber
Anda bisa menggunakannya find -type f. Anda tidak perlu menetapkan jalur pencarian secara eksplisit atau -name "*".
terdon
3

find biasanya merupakan pilihan yang lebih baik untuk pencarian yang rumit daripada menggunakan globbing nama.

find . -mindepth 1 -maxdepth 1 -name '.*'

atau

find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'

find . mencari direktori saat ini

-mindepth 1tidak termasuk. dan .. dari daftar

-maxdepth 1 membatasi pencarian ke direktori saat ini

-name '.*' temukan nama file yang dimulai dengan titik

-o atau

-name '*~' temukan nama file yang diakhiri dengan tilde (biasanya, ini adalah file cadangan dari program pengeditan teks)

Namun, ini dan semua jawaban lainnya kehilangan file yang ada di .hiddenfile direktori saat ini . Jika Anda menulis skrip, maka baris ini akan membaca .hiddenfile dan menampilkan nama file yang ada.

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
Markus H
sumber
Apa .hiddenfile-nya? Mengapa ada file bernama .hiddenyang berisi nama file? Lagi pula, jika ada satu mengapa Anda melakukan sesuatu yang kompleks padahal yang Anda butuhkan adalah cat .hidden? findPerintah Anda benar (ish) tetapi -name '*~'tidak relevan. File yang berakhir dengan tilde adalah file cadangan tetapi tidak disembunyikan dengan cara apa pun.
terdon
@terdon .hiddenFile ini untuk file dan folder yang ingin Anda sembunyikan ketika Anda tidak dapat mengubah nama file / folder untuk memulai dengan titik. Adapun file yang berakhir di tilde, itu tergantung pada sistem. ls -Bakan mengabaikan file seperti itu, seperti halnya kebanyakan penjelajah file GUI.
Mark H
cat .hiddendapat menampilkan file yang tidak ada lagi jika file itu dihapus atau dipindahkan sejak ditambahkan ke .hiddenfile.
Mark H
Ini bekerja dengan baik.
Penghe Geng
2

Saya pikir Anda dapat melakukannya dengan mengikuti perintah.

ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"

ls -a perintah yang Anda masukkan, yang menunjukkan semua file dan direktori di direktori kerja saat ini.

grep "^\."perintah saya tambahkan, yang memfilter output untuk hanya menampilkan file yang tersembunyi (Nama itu dimulai dengan ".").

grep -v "^\.$" | grep -v "^\..$" perintah saya tambahkan, yang menyaring output untuk mengecualikan., .. (Mereka adalah direktori saat ini dan orang tua).

Jika beberapa nama file dapat memiliki lebih dari satu baris dengan "\n", contoh di atas bisa salah.

Jadi saya sarankan perintah berikut untuk menyelesaikannya.

find -maxdepth 1 -name ".[!.]*"
Xiaodongjie
sumber
6
Anda tidakls boleh melewatkan output dari .
Radu Rădeanu
@ RaduRădeanu Saya melihat komentar Anda, Ini sangat bagus. Saya mengedit jawaban saya lagi. Terima kasih atas komentar anda
xiaodongjie
2

Apa lagi yang bisa Anda lakukan, is ls .?*Atau ls .!(|)itu akan menunjukkan kepada Anda segala sesuatu di dir saat ini file / dirs di atas dan file / dirs lainnya di bawah

mis: dari terminal saya

$ 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

Sekarang perhatikan dalam hasil di atas, itu menunjukkan Anda setiap file / dir dengan subdirnya dan file tersembunyi di bawah ini.

[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

Maaf, saya tidak bisa berkomentar. untuk menjelaskan perbedaan di sini antara ls .?*dan jawaban @ cioby23 ls -d .[!.]* .??*Dan mengapa itu benar-benar mencetak file yang tersembunyi dua kali karena secara harfiah Anda meminta dua kali .??*, .?*, .[!.]*mereka hal yang sama, sehingga menambahkan salah satu dari mereka dengan karakter perintah yang berbeda akan mencetak dua kali.

amrx
sumber
1

Anda juga bisa menggunakan:

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

Ini akan memungkinkan Anda untuk menampilkan file tersembunyi normal dan file tersembunyi yang dimulai dengan 2 atau 3 titik misalnya: ..hidden_file

cioby23
sumber
1
Dengan ini saya mendapatkan semua file yang tersembunyi dua kali.
TuKsn
1

Anda bisa menggunakan perintah

ls -Ad .??*

Ini memiliki keunggulan memungkinkan daftar multi-kolom, tidak seperti pendekatan berbasis grep dalam ls -a | grep "^\."solusi

Maythux
sumber
1

Semua jawaban sejauh ini didasarkan pada fakta bahwa file (atau direktori) yang namanya dimulai dengan titik "tersembunyi". Saya datang dengan solusi lain, yang mungkin tidak seefisien, tetapi solusi ini tidak mengasumsikan apa pun tentang nama-nama file yang tersembunyi, dan karena itu menghindari daftar ..dalam hasilnya (seperti halnya jawaban yang saat ini diterima).

Perintah lengkapnya adalah:

ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)

Penjelasan

Apa yang dilakukan adalah daftar semua file (dan direktori) dua kali,

echo -e "$(\ls)\n$(\ls -A)"

tetapi hanya menampilkan file tersembunyi satu kali -A.

Kemudian daftar diurutkan | sortyang membuat file biasa (tidak tersembunyi) muncul dua kali dan bersebelahan.

Kemudian, hapus semua garis yang muncul lebih dari sekali | uniq -u, hanya menyisakan garis yang unik.

Akhirnya gunakan lslagi untuk mendaftar semua file dengan opsi kustom pengguna dan tanpa daftar isi direktori dalam daftar -d.

EDIT (Batasan):

Seperti yang ditunjukkan muru, solusi ini tidak akan berfungsi dengan benar jika ada file dengan nama seperti escaped\ncharacter.txtkarena echo -eakan membagi nama file menjadi dua baris. Ini juga tidak akan berfungsi seperti yang diharapkan jika ada dua file tersembunyi dengan nama yang hampir sama kecuali untuk karakter khusus, seperti .foo[tab].txtdan .foo[new-line].txtkarena keduanya dicetak sebagai .foo?.txtdan akan dihilangkan olehuniq -u

alejandro
sumber
1
Saya pikir itu cukup banyak definisi file tersembunyi. Bahkan asal dari file-file tersembunyi ini adalah dari bug dalam berurusan dengan .sebagai karakter pertama.
muru
Saya menyebutkan itu (sebagai fakta) di paragraf pertama. Namun masih mendapat hasil yang berbeda dari jawaban yang diterima saat ini
alejandro
Tentu, tidak termasuk .., tapi saya ingin tahu seberapa baik kerjanya dengan nama file yang mengandung karakter khusus.
muru
Saya tidak tahu persis apa yang Anda maksud dengan karakter khusus, tetapi saya akan berpikir itu tidak akan menimbulkan masalah, karena solusi ini tidak menganggap apa pun tentang nama file
alejandro
Sebenarnya, Anda mengasumsikan setidaknya satu hal: nama file tidak memiliki baris baru di dalamnya. Juga: nama file tidak memiliki urutan melarikan diri di dalamnya yang echo -eakan menafsirkan. Juga: lstidak akan memotong nama file sehingga dua nama file yang berbeda ditampilkan sama (misalnya, dalam beberapa versi lsakan digunakan ?untuk karakter khusus, jadi .foo\tbar( \t=> tab) dan .foo\nbar( \n=> baris baru) akan muncul sebagai foo?bar).
muru
1

Atau, Anda juga dapat menggunakan echo .*

misalnya

user@linux:~$ echo .*
. .. .bash_aliases .bash_history .bash_logout .bashrc
user@linux:~$

Jika Anda lebih suka dalam format daftar panjang, cukup konversikan ruang putih ke baris baru.

user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$ 
Sabrina
sumber
0

Dengan bash, pengaturan GLOBIGNOREvariabel khusus adalah beberapa nilai yang tidak kosong cukup untuk membuatnya diabaikan .dan ..ketika memperluas gumpalan. Dari dokumen Bash :

The GLOBIGNOREvariabel shell dapat digunakan untuk membatasi set nama file yang cocok pola. Jika GLOBIGNOREdiatur, setiap nama file yang cocok yang juga cocok dengan salah satu pola di GLOBIGNOREdihapus dari daftar yang cocok. Jika nocaseglobopsi diset, pencocokan dengan pola GLOBIGNOREdilakukan tanpa memperhatikan case. Nama file .dan ..selalu diabaikan ketika GLOBIGNOREdiatur dan bukan nol. Namun, pengaturan GLOBIGNOREke nilai non-nol memiliki efek mengaktifkan opsi dotglob shell, sehingga semua nama file lain yang dimulai dengan ‘.'akan cocok.

Jika kita atur .:.., keduanya .dan ..akan diabaikan. Karena menyetelnya ke sesuatu yang bukan nol juga akan mendapatkan perilaku ini, sebaiknya kita atur saja.

Begitu:

GLOBIGNORE=.
ls -d .*
muru
sumber