Kecualikan file tersembunyi saat mencari dengan Unix / Linux?

35

Opsi apa yang perlu saya gunakan finduntuk mengecualikan file tersembunyi?

dari sana
sumber
4
Selain itu: alasan tidak ada beberapa dukungan khusus untuk tugas ini adalah bahwa satu - satunya hal khusus tentang file dinamai dengan '.' adalah bahwa tidak ada terdaftar lskecuali diminta secara khusus: mereka adalah file yang benar-benar biasa dalam segala hal, hanya saja yang lsmemungkinkan Anda mengabaikannya secara default.
dmckee
2
Pertanyaan: apakah Anda ingin menyembunyikan sesuatu .hidden/visible.txt?
Keith Thompson

Jawaban:

14

Saya menemukan ini di sini :

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
Jarvin
sumber
Kenapa tidak adil \( ! -name '.*' \)?
grawity
@grawity Saya baru saja menemukan itu, saya tidak tahu sepenuhnya cara kerjanya. Apakah Anda tidak hanya menyembunyikan file tersembunyi, tetapi direktori tersembunyi dan semua sub-konten dan file tersembunyi di subfolder?
Jarvin
5
Tidak, itu tidak akan: / Tapi \( ! -path '*/.*' \)akan.
grawity
@ kegembiraan Ya, saya kira saya membuat asumsi tentang apa yang diinginkan OP ... Solusi-nama Anda mungkin yang paling dekat dengan apa yang mereka minta.
Jarvin
@ grawity & Dan: Bukan (! -path '^. *') ?? solusi Anda akan mengabaikan file apa pun yang memiliki '.' di mana saja dalam nama file seperti a.exe, b.out dll ....
Software Mechanic
13

Sepertinya negasi pola glob tidak diketahui dengan baik. Jadi Anda bisa menggunakan:

find . -name "[!.]*"
titik merah
sumber
12

Ini tidak menjawab pertanyaan Anda, tetapi untuk tugas menemukan file yang tidak disembunyikan saya ingin membiarkan find menemukan semua file kemudian filter dengan grep.

find . -type f | grep -v '/\.'

Mirip dengan pendekatan Anda tetapi mungkin sedikit lebih sederhana.

Simon Chiang
sumber
Ini adalah satu-satunya dari liners yang bekerja untuk saya.
entpnerd
7

Coba findpenggunaan berikut ini :

find . -type f -not -path '*/\.*'

Yang akan mengabaikan semua file yang tersembunyi (file dan direktori dimulai dengan titik).

kenorb
sumber
1

Saya menulis sebuah skrip bernama findnhyang saya percaya menangani kasus tepi tertentu lebih baik daripada jawaban untuk pertanyaan ini yang saya dapat temukan di web.

#!/bin/bash

declare -a paths

while [ $# -ne 0 ]; do
  case "$1" in -*) break ;; esac
  paths+=("$1")
  shift
done

find "${paths[@]}" \( -name . -o -name .. -o \! \( -name '.*' -prune \) \) "$@"

Misalnya, Anda dapat menemukan file dan direktori yang tidak tersembunyi di dalam direktori tersembunyi yang ditentukan secara eksplisit dengan perintah seperti findnh ~/.hiddendir/, yang akan ditampilkan ~/.hiddendir/filetetapi tidak ~/.hiddendir/.superhiddenfile.

Kurt Glastetter
sumber
1
Sedikit pengkodean yang bagus. Kecuali, ketika saya mencoba findnh ~/.hiddendir/, saya tidak mendapatkan apa-apa. Selain itu, bagaimana bedanya dengan ! -path '*/.*'dan find … | grep -v '/\.'?
G-Man Mengatakan 'Reinstate Monica'
1

Jika Anda bertujuan untuk finddan grep, ripgrepapakah mengecualikan file tersembunyi secara default, mis

rg --files

--files Cetak setiap file yang akan dicari tanpa benar-benar melakukan pencarian.

kenorb
sumber
1

fd

Gunakan fd, alternatif yang sederhana, jauh lebih cepat dan ramah pengguna find. Secara default, ini:

  • Abaikan direktori dan file yang tersembunyi, secara default.
  • Abaikan pola dari Anda .gitignore, secara default.

Periksa analisis Tolok Ukur .

kenorb
sumber
1

Untuk menemukan file tersembunyi:

find -name '[.]*'

Untuk menemukan file yang terlihat:

find -name '[!.]*'

Sesederhana itu.

Carmin
sumber