Pertanyaan Bagaimana cara mengecualikan / mengabaikan file dan direktori tersembunyi dalam pencarian "temukan"?


Mulai dari (perhatikan wildcard sebelum dan sesudah "beberapa teks")

find . -type f -name '*some text*'

bagaimana seseorang dapat mengecualikan / mengabaikan semua file dan direktori tersembunyi?

saya sudah telah googling terlalu lama, datang di beberapa -prune dan! (tanda seru) parameter, tetapi tidak ada contoh yang pas (dan parsimonious) yang baru saja bekerja.

Piping  | untuk grep akan menjadi pilihan dan saya juga akan menyambut contoh-contoh itu; tapi terutama Saya tertarik dengan liner singkat (atau beberapa garis satu yang berdiri sendiri, yang mengilustrasikan berbagai cara untuk mencapai sasaran baris perintah yang sama) hanya menggunakan find.

ps: Temukan file di linux dan kecualikan direktori tertentu tampaknya terkait erat, tetapi a) belum diterima dan b) terkait-tetapi-berbeda-dan-berbeda, tetapi c) dapat memberikan inspirasi dan membantu menunjukkan kebingungan!

Edit

find . \( ! -regex '.*/\..*' \) -type f -name "whatever", bekerja. Regex mencari "apa saja, lalu garis miring, lalu titik, lalu apa saja" (yaitu semua file dan folder tersembunyi termasuk subfoldernya), dan "!" meniadakan regex.


99
2018-03-10 11:58


asal


Tidak membantu dengan apa yang Anda minta dalam pengeditan Anda tetapi lihatlah pertanyaan saya dan jawabannya di sini: unix.stackexchange.com/q/69164/15760 dan juga tautan di jawabannya.
Terkait: Kecualikan file tersembunyi saat mencari dengan Unix / Linux temukan? - kenorb


Jawaban:


Ini mencetak semua file yang merupakan turunan dari direktori Anda, melewati file dan direktori tersembunyi:

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

Jadi jika Anda mencari file dengan some text dalam namanya, dan Anda ingin melewati file dan direktori tersembunyi, jalankan:

find . -not -path '*/\.*' -type f -name '*some text*'

Penjelasan:

Itu -path pilihan berjalan memeriksa pola terhadap seluruh string jalur. * adalah wildcard, / adalah pemisah direktori, \. adalah titik (itu harus diloloskan untuk menghindari arti khusus), dan * adalah wildcard lain. -not berarti jangan pilih file yang cocok dengan tes ini.

Saya tidak berpikir demikian find cukup pintar untuk menghindari pencarian direktori tersembunyi secara rekursif pada perintah sebelumnya, jadi jika Anda membutuhkan kecepatan, gunakan -prune sebagai gantinya, seperti ini:

 find . -type d -path '*/\.*' -prune -o -not -name '.*' -type f -name '*some text*' -print

109
2017-07-09 16:30



Perhatikan yang terakhir yang Anda butuhkan itu -print pada akhirnya! Juga, tidak yakin jika -name '\.*' would be more efficient instead of -path` (karena path mencari subpath, tetapi ini akan dipangkas) - artfulrobot
Apa arti spesialnya . dalam hal ini? - frostschutz
@frostschutz Titik setelah find berarti direktori saat ini: find akan melihat semua file dan direktori di bawah direktori saat ini. Argumen setelahnya path adalah ekspresi reguler, di mana titik biasanya berarti "karakter apa pun", untuk membuatnya berarti titik literal kita harus menghindarinya dengan garis miring terbalik. Argumen setelahnya -name  tidak ekspresi reguler, tetapi memperluas wildcard seperti ? dan * seperti shell. - Flimm
@frostschutz Sebenarnya, kalau dipikir-pikir itu, saya mungkin salah tentang . memiliki arti khusus. - Flimm
@Flimm yup, tidak perlu melarikan diri .. Sejauh yang saya ketahui, hanya ini yang harus dihilangkan: *, ?, dan []. - thdoan


Ini adalah salah satu dari beberapa cara untuk mengecualikan file-file dot yang juga berfungsi dengan benar di BSD, Mac dan Linux:

find "$PWD" -name ".*" -prune -o -print
  • $PWD cetak path lengkap ke direktori saat ini sehingga path tidak dimulai ./
  • -name ".*" -prune cocok dengan semua file atau direktori yang dimulai dengan titik dan kemudian tidak turun
  • -o -print berarti mencetak nama file jika ekspresi sebelumnya tidak cocok dengan apa pun. Menggunakan -print atau -print0 menyebabkan semua ekspresi lain tidak dicetak secara default.

6
2018-03-24 13:51



Tolong jelaskan / jelaskan "sangat rumit"; jawaban sudah diberikan dan jawaban Anda tampaknya memberikan bukti sebaliknya ...? - nutty about natty
"sangat rumit" mungkin berlebihan. Saya menulis ulang jawaban untuk sampai ke intinya. Saya pikir jawaban yang saya posting sulit dimengerti dan sulit untuk dilihat tanpa membaca halaman manual dengan sangat hati-hati. Jika Anda hanya menggunakan GNU temukan maka ada lebih banyak solusi yang memungkinkan. - eradman
-o ... -print membantu. Untuk saya gunakan, sekarang saya punya find ... '!' -name . -name '.*' -prune -o ... -print, yang lebih nyaman daripada termasuk $ PWD. - Roger Pate
$ PWD mungkin harus dikutip, jika ada ruang di dalamnya. - Daniel James
@DanielJames memang, $PWD harus dikutip - eradman


find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)

Tidak termasuk semua direktori tersembunyi, dan file tersembunyi di bawah $ DIR


4
2018-02-28 00:49



Ini adalah jawaban yang sempurna. Secara rekursif menemukan semua file tetapi tidak termasuk item baris untuk direktori dan file tersembunyi. Terima kasih! - KyleFarris


 Itu menjawab Awalnya saya memposting sebagai "edit" untuk pertanyaan asli saya di atas:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever", bekerja. Regex mencari "apa saja, lalu garis miring, lalu titik, lalu apa saja" (yaitu semua file dan folder tersembunyi termasuk subfoldernya), dan "!" meniadakan regex.


3
2017-08-11 07:31



Serupa, tetapi hanya untuk folder saat ini: find . \( ! -regex './\..*' \) -type f -maxdepth 1 -print - phyatt


Anda tidak harus menggunakannya find untuk itu. Cukup gunakan globstar di shell itu sendiri, seperti:

echo **/*foo*

atau:

ls **/*foo*

dimana **/ mewakili setiap folder secara rekursif dan *foo* file apa saja yang ada foo atas namanya.

Secara default menggunakan ls akan mencetak nama file tidak termasuk file dan direktori tersembunyi.

Jika Anda tidak memiliki globbing diaktifkan, lakukan dengan shopt -s globstar.

catatan: Pilihan globbing barubekerja di Bash 4, zsh dan shell serupa.


Contoh:

$ mkdir -vp a/b/c/d
mkdir: created directory 'a'
mkdir: created directory 'a/b'
mkdir: created directory 'a/b/c'
mkdir: created directory 'a/b/c/d'
$ touch a/b/c/d/foo a/b/c/d/bar  a/b/c/d/.foo_hidden a/b/c/d/foo_not_hidden
$ echo **/*foo*
a/b/c/d/foo  a/b/c/d/foo_not_hidden

3
2018-04-20 09:49



Anda tidak perlu ls untuk itu! echo **/*foo* - Kevin Cox
@kenorb (dan @ kevin-cox). Bisakah Anda sedikit lebih verbose? Mengapa globstar (= *) berfungsi di sini dan bagaimana caranya? Apa yang tebasan / lakukan? - nutty about natty
@nuttyaboutnatty / berarti folder, itu memisahkan direktori dari nama file. * pada dasarnya mewakili segalanya. - kenorb
@kenorb ya-tapi: bagaimana itu membantu satu-liner dengan pertanyaan asli? - nutty about natty
@nuttyaboutnatty Klarifikasi dan menambahkan contoh. Ini membantu dengan menemukan file mengabaikan yang tersembunyi. - kenorb


find memiliki switch logika yang rapi seperti -and dan -not Anda dapat menggunakannya untuk keuntungan Anda untuk menemukan file yang cocok dengan dua aturan seperti:

$ touch non_hidden_file.txt .hidden_file.txt somethings/.another_hidden_file.txt                                                 

$ find . -type f -name '*hidden_file*' -and \( -not -name ".*" \)                            
./non_hidden_file.txt

Seperti yang Anda lihat, find menggunakan dua aturan -name '*hidden_file*' dan -and \( -not -name ".*" \) untuk menemukan nama-nama file yang cocok dengan kedua kondisi - nama file dengan hidden_file di dalamnya tetapi tanpa titik awal. Perhatikan garis miring di depan tanda kurung - mereka digunakan untuk mendefinisikan tanda kurung sebagai find argumen agak mendefinisikan subkulit (yang adalah apa yang berarti kurung sebaliknya tanpa garis miring)


1
2018-05-15 22:01