Cara mencocokkan * dengan file tersembunyi di dalam direktori


21

Cara mencocokkan file tersembunyi di dalam direktori yang diberikan

sebagai contoh

Jika saya memberikan perintah di bawah ini tidak memberikan hasil dari file yang disembunyikan,

 du -b maybehere*/*

bagaimana mencapai ini sederhana menggunakan perintah tunggal daripada menggunakan

du -b maybehere*/.* maybehere*/*

karena saya perlu mengetik mungkin di sini dua kali.


Cobalah untuk hanya disembunyikan maybehere*/.*dan tambahkan ke atas untuk semua
Costas

1
Hasil edit Anda membuat pertanyaan baru dengan batasan tambahan, yang membuat Q menjadi target bergerak, mungkin membatalkan jawaban yang sudah diberikan. Itu perilaku buruk, tanyakan saja pertanyaan baru jika Anda punya.
Anthon

Jawaban:


22

Manfaatkan ekspansi brace:

du -b maybehere*/{*,.[^.],.??*}

atau sebagai alternatif

du -b maybehere*/{,.[^.],..?}*

Logika di balik ini mungkin tidak jelas, jadi inilah penjelasannya:

  • * cocok dengan semua file yang tidak disembunyikan
  • .[^.]cocok dengan file yang namanya dimulai dengan satu titik diikuti dengan bukan titik; itu hanya 2 nama file karakter dalam bentuk pertama.
  • .??* cocok dengan file tersembunyi yang panjangnya minimal 3 karakter
  • ..?* seperti di atas, tetapi karakter kedua harus berupa titik

Intinya adalah untuk mengecualikan tautan keras ke direktori saat ini dan induk ( .dan ..), tetapi sertakan semua file normal sedemikian rupa sehingga masing-masing akan dihitung hanya sekali!

Misalnya, yang paling sederhana adalah menulis

du -b maybehere*/{.,}*

Ini berarti bahwa daftar berisi titik .dan "tidak ada" (tidak ada yang berada di antara ,dan menutup }), sehingga semua file yang tersembunyi (yang dimulai dari titik) dan semua file yang tidak tersembunyi (yang dimulai dari "tidak ada") akan cocok. Masalahnya adalah ini juga cocok .dan .., dan ini kemungkinan besar bukan yang Anda inginkan, jadi kami harus mengecualikannya.


Kata terakhir tentang ekspansi brace.

Ekspansi Brace adalah mekanisme di mana Anda dapat memasukkan lebih banyak file / string / apa pun ke baris perintah dengan menulis lebih sedikit karakter. Sintaksnya adalah {word1,word2,...}, yaitu daftar string yang dipisahkan koma yang dimulai dari {dan diakhiri dengan }. bashmanual memberikan contoh penggunaan yang sangat mendasar dan sekaligus sangat umum:

$ echo a{b,c,d}e
abe ace ade

apa gunanya { }saya tidak tahu :( dapatkah Anda memberi saya arahan untuk mendapatkan lebih banyak info tentang hal itu
vidhan

@vidhan lihat hasil edit, dan lihat man bashbab "Ekspansi Brace".
jimmij

maukah Anda memberi saya lebih banyak penjelasan untuk hal di atas dan sedikit lebih jelas menjelaskan bagaimana setiap hal bekerja karena saya baru dengan hal-hal ini @jimmij
vidhan

6
.??*gagal mencocokkan .a, .b... .[^.]*gagal mencocokkan ..foo.
Stéphane Chazelas

4
.foococok dengan keduanya .[^.]*dan .??*. Kamu ingin {.[!.],..?,}*.
Stéphane Chazelas

14

Karena Anda sudah menggunakan sintaks khusus GNU ( -b):

du -abd1 maybehere*/

Dengan begitu, itu adalah dudaftar file dalam maybehere*direktori (dan tidak mengecualikan file dot). -d1membatasi pelaporan penggunaan disk ke satu level ke bawah (termasuk direktori non-dengan -a).

Kalau tidak, agar gumpalan menyertakan file tersembunyi (kecuali .dan ..), masing-masing shell memiliki sintaksnya sendiri:

  • zsh:

    du -b maybehere*/*(D)
  • ksh93:

    (FIGNORE='@(.|..)'; du -b maybehere*/*)
  • bash:

    (shopt -s dotglob; du -b maybehere*/*)
  • tcsh:

    (set globdot; du -b maybehere*/*)
  • yash:

    (set -o dot-glob; du -b maybehere*/*)

    meskipun hati-hati itu termasuk .dan ..pada sistem yang memasukkan mereka dalam hasil readdir() yang membuatnya hampir tidak dapat digunakan.


8

Opsi lain tersedia di sini :

du -sm .[!.]* *

Mengapa Anda ingin melewatkan nama file mulai dengan ..?
Kusalananda

2
Agaknya, karena mereka tidak ingin mendaftar semuanya di dalam ../dan di bawah.
Shadur

Ini tidak menghitung file seperti misalnya ..myfile; tambahkan ..?*untuk itu. Tapi +1 untuk menggunakan sintaks glob yang tepat untuk kecocokan negatif.
Pedro Gimeno

0

Jika Anda hanya ingin daftar direktori tersembunyi atau beroperasi pada direktori tersembunyi maka seperti yang dikatakan Costas, Anda dapat menggunakannya

du -b maybehere*/.*

Ini akan memungkinkan Anda untuk beroperasi pada file dan direktori tersembunyi. Jika Anda hanya ingin direktori tersembunyi maka Anda dapat menentukannya dengan

du -b maybehere*/.*/


dapatkah Anda melihat pertanyaannya sekali lagi @SailorCire Saya telah mengeditnya sedikit
vidhan

@vidhan jadi Anda hanya ingin bekerja tersembunyi di dalam satu direktori? Apakah itu benar?
SailorCire

tidak, saya ingin mencocokkan file yang tersembunyi dan yang tidak tersembunyi di dalam satu direktori alih-alih menggunakan keduanya maybehere*/.*dan maybehere*/*satu dari yang tersembunyi dan yang lain untuk yang tidak tersembunyi
vidhan

@vidhan du -bmengambil baik yang tersembunyi maupun yang tidak tersembunyi.
SailorCire

no :( sayangnya @SailorCire
vidhan

0

Meskipun tidak langsung shell, Anda dapat menggunakan find dengan kedalaman terbatas seperti ini

find maybehere -maxdepth 1 -exec du -sh {} \;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.