Tìm đệ quy các tệp có phần mở rộng cụ thể


81

Tôi đang cố gắng tìm các tệp có phần mở rộng cụ thể. Ví dụ: tôi muốn tìm tất cả các tệp .pdf và .jpg có tên Robert

Tôi biết tôi có thể thực hiện lệnh này

$ find . -name '*.h' -o -name '*.cpp'

nhưng tôi cần chỉ định tên của tệp bên cạnh các phần mở rộng. Tôi chỉ muốn xem liệu có cách nào khả thi để tránh viết lại tên tệp nhiều lần Cảm ơn bạn!


4
inameThay vào đó , bất kỳ ai sao chép lệnh này hoặc bất kỳ lệnh nào bên dưới lệnh này đều nên sử dụng - không phân biệt chữ hoa chữ thường .
Addison,

Điểm tốt, Addison (do đó là +1). Tuy nhiên, có vẻ như OP muốn các tệp có tên 'Robert' với chữ 'R' viết hoa. Khi tôi giải thích bài đăng, điều này có nghĩa là các tệp chứa 'robert' KHÔNG nên được xuất ra. ' R obert` là những gì được viết. Tuy nhiên, có những tình huống khi ai đó muốn tìm thấy 'Robert' hoặc 'robert'. Có thể OP đang ở trong tình huống này. Sử dụng inamehay không namephụ thuộc vào những gì bạn muốn tìm. Tôi đã ở trong những tình huống mà trường hợp này là cần thiết.
bballdave025,

Câu trả lời:


100

Quyền của tôi:

find . -name '*.jpg' -o -name '*.png' -print | grep Robert

2
Hoạt động độc đáo, nhưng nhẹ bất lợi là nó ngăn cản bạn làm mộtfind -exec ...
Đánh dấu Setchell

Điều gì sẽ xảy ra nếu tôi muốn tìm tất cả các tệp xxx-deploy.yml trong tất cả các thư mục trong một đường dẫn cụ thể?
Naim Salameh

Điều này không hoạt động tốt nếu bạn có jpghoặc pnglà một phần của con đường dài hơn.
AutonomousApps

17

Sử dụng find's -regexđối số:

find . -regex '.*/Robert\.\(h\|cpp\)$'

Hoặc chỉ sử dụng -name:

find . -name 'Robert.*' -a \( -name '*.cpp' -o -name '*.h' \)

4
find -name "*Robert*" \( -name "*.pdf" -o -name "*.jpg" \)

Các trả -olời một ORđiều kiện và bạn có thể thêm bao nhiêu tùy thích trong niềng răng. Vì vậy, điều này nói để tìm tất cả các tệp có chứa từ "Robert" ở bất kỳ đâu trong tên của chúng và có tên kết thúc bằng "pdf" hoặc "jpg".


3

Thay thế cho việc sử dụng -regextùy chọn bật find, vì câu hỏi được gắn nhãn, bạn có thể sử dụng cơ chế mở rộng dấu ngoặc nhọn:

eval find . -false "-o -name Robert".{jpg,pdf}

tìm báo cáo "đường dẫn phải đứng trước biểu thức", vấn đề là gì? Tôi thường thêm trích dẫn để giải quyết nó, nhưng không hiệu quả với biểu thức này. Cảm ơn!
netawater

Tôi nghi ngờ bạn đã quên evalhoặc câu .lệnh ở trên, hoặc của bạn findlà bí danh của một thứ gì đó phức tạp hơn, hoặc bạn không sử dụng GNU cổ phiếu findtrên phiên bản Linux của mình.
jxh

Cảm ơn bạn đã trả lời, tôi đã sử dụng tập lệnh như sau: FILEEXTEIONS = cs, [ch] eval find. -false "-o -name *". {$ FILEEXTEIONS} và nó báo lỗi đó.
netawater

Theo tôi được biết, hiện tượng giãn nở biến đổi sẽ không xảy ra bên trong niềng răng mở rộng mắc cài.
jxh

1
Tôi muốn sử dụng kỹ thuật này trong Android shell nhưng nó findkhông hỗ trợ -false. Tôi làm việc này bằng cách đưa ra hai điều kiện lẫn nhau độc quyền để họ chung sai: -inum 1 -inum 2.
starfry


1

Dưới dạng một tập lệnh, bạn có thể sử dụng:

find "${2:-.}" -iregex ".*${1:-Robert}\.\(h\|cpp\)$" -print
  • lưu nó như findcc
  • chmod 755 findcc

và sử dụng nó như

findcc [name] [[search_direcory]]

ví dụ

findcc                 # default name 'Robert' and directory .
findcc Joe             # default directory '.'
findcc Joe /somewhere  # no defaults

lưu ý bạn không thể sử dụng

findcc /some/where    #eg without the name...

cũng như thay thế, bạn có thể sử dụng

find "$1" -print | grep "$@" 

findcc directory grep_options

giống

findcc . -P '/Robert\.(h|cpp)$'

1

Sử dụng bash globbing (nếu findkhông phải là bắt buộc)

ls Robert.{pdf,jpg} 

0

Recurisvely với ls: (-al để bao gồm các thư mục ẩn)

ftype="jpg"
ls -1R *.${ftype}  2> /dev/null
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.