Bagaimana saya harus glob untuk semua file yang tersembunyi?

22

Saya ingin melakukan beberapa tindakan (katakanlah chown) pada semua file yang tersembunyi di direktori.

Saya tahu bahwa ini .*adalah tidak ide yang baik karena juga akan menemukan arus .dan orangtua ..direktori (saya tahu bahwa rmakan gagal untuk beroperasi pada .dan ..tetapi perintah lain, termasuk chowndan chmod, dengan senang hati akan berlaku)

Tetapi semua file tersembunyi saya memiliki nama yang berbeda!

Bagaimana saya harus menggumpal untuk semua file yang disembunyikan sementara tidak termasuk .dan ..?

Zanna
sumber

Jawaban:

20

Anda dapat menggunakan extglobpola berikut :

.@(!(.|))
  • .cocok dengan literal .pada awalnya

  • @()adalah sebuah extglobpola, akan cocok dengan salah satu pola di dalamnya, karena kami hanya memiliki satu pola di dalamnya, ia akan memilih itu

  • !(.|)adalah extglobpola lain (bersarang), yang cocok dengan file apa pun tanpa atau satu .; Seperti yang sudah kami cocokkan .di awal, seluruh pola ini akan cocok dengan semua file yang dimulai dengan .kecuali .dan ...

extglobdiaktifkan pada sesi interaktif bashsecara default di Ubuntu. Jika tidak, aktifkan dulu:

shopt -s extglob

Contoh:

$ echo .@(!(.|))
.bar .foo .spam
heemayl
sumber
Ini jelas hal yang luar biasa yang perlu saya pelajari! Terima kasih telah mengajar
Zanna
@Zanna Senang saya bisa membantu :)
heemayl
2
Apa tujuan dari @()? Sederhana .!(.|)tampaknya bekerja secara identik.
Kyle Strand
1
Saya tahu ini sudah lama, tetapi saya memiliki pertanyaan yang sama dengan @KyleStrand. Dalam pengujian saya, !(.|)kerjanya sama. Apakah ada tujuan @()di balik konteks ini?
Paddy Landau
Apakah karakter bang negasi? Tidak disebutkan, dan membaca penjelasan Anda, saya mendapat kesan, bahwa polanya cocok dengan titik dan doubledot, tetapi Anda dengan jelas menggambarkan file yang cocok dengan titik awal, kecuali hanya dua.
pengguna tidak diketahui
20
 GLOBIGNORE=".:.."

untuk menyembunyikan. dan .. direktori. Ini juga menetapkan dotglobopsi: *cocok dengan file yang tersembunyi dan tidak tersembunyi.

Anda juga bisa melakukannya

shopt -s dotglob

Gilles :)

Rinzwind
sumber
9

Anda dapat menggunakan findperintah di sini. Misalnya sesuatu seperti

find -type f -name ".*" -exec chmod 775 {} \;

Ini akan menemukan file tersembunyi dan mengubah izin


Edit untuk memasukkan komentar oleh @gerrit:

find -type f -maxdepth 1 -name ".*" -exec chmod 775 {} \;

Ini akan membatasi pencarian di atas direktori saat ini daripada mencari secara rekursif.

Wayne_Yux
sumber
4
Anda mungkin ingin menambahkan di -maxdepth 1sini agar lebih cocok dengan perilaku dalam pertanyaan dan jawaban lainnya.
gerrit