Jawaban:
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
.
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 .!(|.)
ls -d .!(|.)
Melakukan persis apa yang dicari OP.
!(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
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 ....foo
tidak akan ditampilkan.
Anda juga bisa menggunakan find
:
find -mindepth 1 -prune -name '.*'
The -mindepth
memastikan bahwa kami tidak cocok .
dan -prune
berarti bahwa find
tidak akan turun ke subdirektori.
Menggunakan find
dan 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.
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.
find . -mindepth 1 -maxdepth 1 -name '.*'
atau
find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'
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.
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
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 adalah cat .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 | 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 ".[!.]*"
ls
boleh melewatkan output dari .
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.
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 | 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
karena echo -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
.
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 versi ls
akan digunakan ?
untuk karakter khusus, jadi .foo\tbar
( \t
=> tab) dan .foo\nbar
( \n
=> baris baru) akan muncul sebagai foo?bar
).
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:~$
Dengan bash, pengaturan GLOBIGNORE
variabel khusus adalah beberapa nilai yang tidak kosong cukup untuk membuatnya diabaikan .
dan ..
ketika memperluas gumpalan. Dari dokumen Bash :
The
GLOBIGNORE
variabel shell dapat digunakan untuk membatasi set nama file yang cocok pola. JikaGLOBIGNORE
diatur, setiap nama file yang cocok yang juga cocok dengan salah satu pola diGLOBIGNORE
dihapus dari daftar yang cocok. Jikanocaseglob
opsi diset, pencocokan dengan polaGLOBIGNORE
dilakukan tanpa memperhatikan case. Nama file.
dan..
selalu diabaikan ketikaGLOBIGNORE
diatur dan bukan nol. Namun, pengaturanGLOBIGNORE
ke 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 .*
ls -ld .*
atauls -ald .*
akan bekerja