Saya memiliki direktori yang berisi ribuan file, beberapa di antaranya tersembunyi.
Perintah ini ls -a
mencantumkan semua file, termasuk yang tersembunyi, tetapi saya hanya perlu membuat daftar file yang tersembunyi.
Perintah apa yang harus saya gunakan?
command-line
ls
nux
sumber
sumber
ls -ld .*
atauls -ald .*
akan bekerjaJawaban:
Perintah :
Hanya akan mencantumkan file tersembunyi.
Jelaskan:
sumber
.
dan..
dari pertandingan. Namun itu juga akan mengecualikan nama file tersembunyi satu karakter (seperti legal).a
,.1
dan sebagainya. Mungkin glob yang lebih panjang adalah.!(|.)
titik literal diikuti oleh apa pun kecuali titik apa pun (tunggal) yaituls -d .!(|.)
Melakukan persis apa yang dicari OP.
sumber
!(pattern-list)
,pattern-list
adalah 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?.
tidak diikuti oleh (tidak ada atau.
), mengecualikan.
dirinya sendiri dan..
.Jika Anda hanya ingin file di direktori Anda saat ini (tanpa rekursi), Anda bisa melakukannya
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....foo
tidak akan ditampilkan.Anda juga bisa menggunakan
find
:The
-mindepth
memastikan bahwa kami tidak cocok.
dan-prune
berarti bahwafind
tidak akan turun ke subdirektori.sumber
bekerja untuk saya di Bash.
sumber
.
dan..
di BashMenggunakan
find
danawk
,Penjelasan:
find . -type f
-> Daftar semua file dalam direktori saat ini bersama dengan jalurnya seperti,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.sumber
find -type f
. Anda tidak perlu menetapkan jalur pencarian secara eksplisit atau-name "*"
.find
biasanya merupakan pilihan yang lebih baik untuk pencarian yang rumit daripada menggunakan globbing nama.atau
find .
mencari direktori saat ini-mindepth 1
tidak 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
.hidden
file direktori saat ini . Jika Anda menulis skrip, maka baris ini akan membaca.hidden
file dan menampilkan nama file yang ada.sumber
.hidden
file-nya? Mengapa ada file bernama.hidden
yang berisi nama file? Lagi pula, jika ada satu mengapa Anda melakukan sesuatu yang kompleks padahal yang Anda butuhkan adalahcat .hidden
?find
Perintah Anda benar (ish) tetapi-name '*~'
tidak relevan. File yang berakhir dengan tilde adalah file cadangan tetapi tidak disembunyikan dengan cara apa pun..hidden
File 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 -B
akan mengabaikan file seperti itu, seperti halnya kebanyakan penjelajah file GUI.cat .hidden
dapat menampilkan file yang tidak ada lagi jika file itu dihapus atau dipindahkan sejak ditambahkan ke.hidden
file.Saya pikir Anda dapat melakukannya dengan mengikuti perintah.
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.
sumber
ls
boleh melewatkan output dari .Apa lagi yang bisa Anda lakukan,
is ls .?*
Atauls .!(|)
itu akan menunjukkan kepada Anda segala sesuatu di dir saat ini file / dirs di atas dan file / dirs lainnya di bawahmis: dari terminal saya
Sekarang perhatikan dalam hasil di atas, itu menunjukkan Anda setiap file / dir dengan subdirnya dan file tersembunyi di bawah ini.
Maaf, saya tidak bisa berkomentar. untuk menjelaskan perbedaan di sini antara
ls .?*
dan jawaban @ cioby23ls -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.sumber
Anda juga bisa menggunakan:
Ini akan memungkinkan Anda untuk menampilkan file tersembunyi normal dan file tersembunyi yang dimulai dengan 2 atau 3 titik misalnya:
..hidden_file
sumber
Anda bisa menggunakan perintah
Ini memiliki keunggulan memungkinkan daftar multi-kolom, tidak seperti pendekatan berbasis grep dalam
ls -a | grep "^\."
solusisumber
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:
Penjelasan
Apa yang dilakukan adalah daftar semua file (dan direktori) dua kali,
tetapi hanya menampilkan file tersembunyi satu kali
-A
.Kemudian daftar diurutkan
| sort
yang 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
ls
lagi 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.txt
karenaecho -e
akan 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].txt
dan.foo[new-line].txt
karena keduanya dicetak sebagai.foo?.txt
dan akan dihilangkan olehuniq -u
sumber
.
sebagai karakter pertama...
, tapi saya ingin tahu seberapa baik kerjanya dengan nama file yang mengandung karakter khusus.echo -e
akan menafsirkan. Juga:ls
tidak akan memotong nama file sehingga dua nama file yang berbeda ditampilkan sama (misalnya, dalam beberapa versils
akan digunakan?
untuk karakter khusus, jadi.foo\tbar
(\t
=> tab) dan.foo\nbar
(\n
=> baris baru) akan muncul sebagaifoo?bar
).Atau, Anda juga dapat menggunakan
echo .*
misalnya
Jika Anda lebih suka dalam format daftar panjang, cukup konversikan ruang putih ke baris baru.
sumber
Dengan bash, pengaturan
GLOBIGNORE
variabel khusus adalah beberapa nilai yang tidak kosong cukup untuk membuatnya diabaikan.
dan..
ketika memperluas gumpalan. Dari dokumen Bash :Jika kita atur
.:..
, keduanya.
dan..
akan diabaikan. Karena menyetelnya ke sesuatu yang bukan nol juga akan mendapatkan perilaku ini, sebaiknya kita atur saja.
Begitu:
sumber