Loại trừ các tập tin ẩn khi tìm kiếm với Unix / Linux find?


35

Tôi cần sử dụng tùy chọn nào findđể loại trừ các tệp ẩn?


4
Ngoài ra: lý do không có hỗ trợ đặc biệt nào cho nhiệm vụ này là điều duy nhất đặc biệt về các tệp có tên 'hàng đầu'. là không được liệt kê bởi lstrừ khi được yêu cầu cụ thể: chúng là các tệp hoàn toàn bình thường ở mọi khía cạnh, nó chỉ lscho phép bạn bỏ qua chúng theo mặc định.
dmckee

2
Câu hỏi: bạn có muốn giấu một cái gì đó như thế .hidden/visible.txtnào?
Keith Thompson

Câu trả lời:


14

Tôi tìm thấy cái này ở đây :

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"

Tại sao không chỉ \( ! -name '.*' \)?
grawity

@grawity Tôi chỉ thấy rằng, tôi hoàn toàn không biết nó hoạt động như thế nào. Bạn sẽ không chỉ ẩn các tệp ẩn, mà các thư mục ẩn và tất cả các nội dung phụ và các tệp ẩn của chúng trong các thư mục con?
Jarvin

5
Không, nó sẽ không: / Nhưng \( ! -path '*/.*' \)sẽ.
grawity

@grawity Ya, tôi đoán tôi đã đưa ra một giả định về những gì OP muốn ... Giải pháp tên của bạn có lẽ là gần nhất với những gì họ yêu cầu.
Jarvin

@ grawity & Dan: Không phải thế (! -path '^. *') ?? giải pháp của bạn sẽ bỏ qua bất kỳ tệp nào có '.' bất cứ nơi nào trong tên tệp như a.exe, b.out, v.v ....
Cơ chế phần mềm

13

Có vẻ như mô hình toàn cầu phủ định không được biết đến nhiều. Vì vậy, bạn có thể sử dụng:

find . -name "[!.]*"

12

Điều này không trả lời câu hỏi của bạn, nhưng đối với nhiệm vụ tìm các tệp không bị ẩn, tôi muốn cho phép tìm tất cả các tệp sau đó lọc bằng grep.

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

Tương tự như cách tiếp cận của bạn nhưng có lẽ đơn giản hơn một chút.


Đây là người duy nhất trong số những người làm việc cho tôi.
entpnerd

7

Hãy thử findcách sử dụng sau :

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

Mà sẽ bỏ qua tất cả các tập tin ẩn (tập tin và thư mục bắt đầu bằng một dấu chấm).


1

Tôi đã viết một kịch bản có tên findnhmà tôi tin rằng xử lý các trường hợp cạnh nhất định tốt hơn các câu trả lời cho câu hỏi này mà tôi có thể tìm thấy trên 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 \) \) "$@"

Ví dụ: bạn có thể tìm thấy các tệp và thư mục không bị ẩn bên trong một thư mục ẩn được chỉ định rõ ràng với một lệnh như findnh ~/.hiddendir/, sẽ hiển thị ~/.hiddendir/filenhưng không ~/.hiddendir/.superhiddenfile.


1
Một chút tốt đẹp của mã hóa. Ngoại trừ, khi tôi cố gắng findnh ~/.hiddendir/, tôi không nhận được gì. Khác với điều đó, nó khác với ! -path '*/.*'find … | grep -v '/\.'như thế nào?
G-Man nói 'Phục hồi Monica'

1

Nếu bạn nhắm mục tiêu là findgrep, ripgrepkhông loại trừ các tệp ẩn theo mặc định, ví dụ:

rg --files

--files In từng tệp sẽ được tìm kiếm mà không thực sự tìm kiếm.


1

fd

Sử dụng fd, một sự thay thế đơn giản, nhanh hơn nhiều và thân thiện với người dùng find. Theo mặc định, nó:

  • Bỏ qua các thư mục và tập tin ẩn, theo mặc định.
  • Bỏ qua các mẫu từ của bạn .gitignore, theo mặc định.

Kiểm tra phân tích điểm chuẩn .


1

Để tìm tập tin ẩn:

find -name '[.]*'

Để tìm tập tin hiển thị:

find -name '[!.]*'

Nó là đơn giản.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.