Làm cách nào tôi có thể tìm thấy một tệp có tên bao gồm một chuỗi đã cho, chẳng hạn như abcde Ab?


Câu trả lời:


13

findsẽ xem qua cấu trúc thư mục và trả về kết quả dựa trên toàn cầu :

find /your/dir -name "*abcde*"

Thêm công -type ftắc sẽ tinh chỉnh tiêu chí tìm kiếm của bạn để chỉ trả lại tệp.

find /your/dir -type f -name "*abcde*"

Bạn cũng có thể bao gồm các công tắc khác muốn -maxdepth 2giới hạn tìm kiếm ở 2 cấp độ thư mục dưới mức được chỉ định.

Bằng cách này, bạn có thể xây dựng một lệnh tìm kiếm phong phú, được nhắm mục tiêu cao sẽ nhanh chóng trả về chính xác những gì bạn cần.

man findcó rất nhiều chi tiết, bao gồm các hành động như -execchạy một lệnh trên các tệp được trả về findvà các tùy chọn để sử dụng các biểu thức thông thường.


3
Bạn cũng có thể muốn thêm -type fvào findđể bạn chỉ nhận được kết quả là các tệp. find /your/dir -type f -name "*abcde*"
Steven Pritchard

Điểm hay Steven: Tôi sẽ cập nhật câu trả lời của tôi. Cảm ơn bạn.
jasonwryan


3

Nếu locatephù hợp với bạn (nó nhanh, nhưng chỉ tốt như lần chạy gần đây nhất sudo updatedb). Bạn có thể chạy locatebằng tiện ích regex tích hợp sẵn của nó ...

Đây là một kịch bản điều khiển tham số để làm những gì bạn muốn. Gọi nó với $ 1 là "abcde" mà bạn đang tìm kiếm và với các tham số tiếp theo là các thư mục:

#!/bin/bash
a=("$@"); r=''
for ((i=1;i<${#a[@]};i++)); do r="$r|${a[i]}"; done
locate --regex  "(${r:1}).*/[^/]*${a[0]}[^/]*$"

Một cuộc gọi ví dụ trông như thế này:

$ ./script_name 'z' "$HOME/bin/perl" "$HOME/type/stuff"

Theo đề xuất của jasonwryan , đây là phiên bản nhận xét của kịch bản.
Hãy nhớ rằng locate luôn luôn xuất ra các đường dẫn đủ điều kiện.

#!/bin/bash

# Note: Do not use a trailing / for directory names
# 
# Any of the args can be an extended regex pattern. 
#
# Create an array `a` which contains "$1", "$2", "$3", etc... (ie. "$@")
# writing the $-args to an array like this (using quotes) solves 
#   any possible problem with embedded whitespace 
a=("$@")
#
# Set up an empty string which is to be built into a regex pattern 
#   of all directroy names (or an appropriate regex pattern)
r=''
#
# Each regex pattern is to be an extended regex    
# Each regex pattern is concatenated to the preceding one 
#   with the  extended-regex 'or' operator |
#
# Step through the array, starting at index 1 (ie, $2),
#   and build the 'regex-pattern' for the directories 
for ((i=1;i<${#a[@]};i++)); do r="$r|${a[i]}"; done
#
# Run 'locate' with
#                           |the target file pattern $1  | 
#                |zero-to-| |preceded and followed by    |
#                |-many   | |zero-to-many non-slash chars|
#                |anything| |               |‾‾‾‾‾‾‾‾‾‾‾‾
#                 ‾‾‾‾‾‾‾|| |               |   
locate --regex  "(${r:1}).*/[^/]*${a[0]}[^/]*$"
#        ________|      |  | 
#       |directory-regex| last
#       | in brackets ()| slash      
#       |stripped of its|
#       |leading "|"    |
#

Được ủng hộ cho kịch bản: nhưng sẽ rất hữu ích khi (bình luận) bình luận nó để nó rõ ràng về những gì đang thực sự xảy ra ở đó ...
jasonwryan

Làm tốt lắm, fred! Tôi sẽ upvote một lần nữa nếu tôi có thể. Cảm ơn bạn.
jasonwryan

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.