Cách chỉ tìm tệp trong thư mục đã cho và bỏ qua thư mục con bằng bash


129

Tôi đã xem xét các câu hỏi tương tự khác, nhưng không tìm thấy câu hỏi nào cho phép tôi nắm bắt khái niệm này và làm cho nó phù hợp với tình huống của tôi dựa trên thời gian giới hạn của tôi. Tôi chỉ đơn giản là chạy lệnh find để tìm một số tệp nhất định, nhưng một số tệp trong thư mục con có cùng tên mà tôi muốn bỏ qua. Cảm ơn vì bất kì sự giúp đỡ. Dưới đây là lệnh mà tôi đang sử dụng:

Các tệp / mẫu tôi quan tâm: / dev / abc-Scanner, / dev / abc-cash ....

Lệnh:

find /dev/ -name 'abc-*'

Những gì đang được trả lại:

/dev/abc-scanner
/dev/abc-cash
...
...
...
/dev/.udev/names/abc-scanner
/dev/.udev/names/abc-cash

Tôi muốn bỏ qua các tệp sau: /dev/.udev / ...


9
bỏ qua các thư mục con cụ thể, hoặc không đi xuống bất kỳ thư mục con nào? Đối với cái sau, hãy sử dụng tùy chọn -maxdepth 1
frankc

@frankc Đăng nó như một câu trả lời.
cnicutar

Câu trả lời:


202

Nếu bạn chỉ muốn giới hạn tìm kiếm ở cấp độ đầu tiên, bạn có thể làm:

 find /dev -maxdepth 1 -name 'abc-*'

... hoặc nếu bạn đặc biệt muốn loại trừ .udevthư mục, bạn có thể làm:

 find /dev -name '.udev' -prune -o -name 'abc-*' -print

Nếu tôi muốn liệt kê nơi tất cả các liên kết tượng trưng ở trên được tìm thấy trong mẫu ở trên, tôi sẽ chỉ sử dụng một đường ống? Một cái gì đó như find / dev -maxdepth 1 -name 'abc- *' | ls -l
acha

1
xargsThay vào đó, tốt hơn là sử dụng , vì vậy đại loại như: find /dev -maxdepth 1 -name 'abc-*' | xargs ls -lnhưng nếu có bất kỳ cơ hội nào họ sẽ có khoảng trắng trong tên, bạn nên làmfind /dev -maxdepth 1 -name 'abc-*' -print0 | xargs -0 ls -l
Mark Longair

Tuy nhiên, như câu trả lời của Stephen Darlington chỉ ra , tôi không chắc tại sao bạn lại không làmls -l /dev/abc-*
Mark Longair

Ngoài ra, nếu bạn muốn tìm ra nơi liên kết tượng trưng đến, bạn có thể làmfor x in /dev/abc-*; do readlink -f $x; done
Đánh dấu Longair

1
Hoặc nếu bạn chỉ muốn các thư mục con ở cấp độ đầu tiên, ls -l /dev/abc-* /dev/*/abc-* | fgrep -v /dev/.udev... ngoại trừ ít nhất trên Linux của tôi /dev/*/*không bao gồm các tệp /dev/.udev/*để bạn có thể bỏ qua fgrep -v.
tripleee

9

Có bất kỳ lý do cụ thể mà bạn cần phải sử dụng find? Bạn chỉ có thể sử dụng lsđể tìm các tệp khớp với một mẫu trong một thư mục.

ls /dev/abc-*

Nếu bạn cần sử dụng find, bạn có thể sử dụng công -maxdepth 1tắc để chỉ áp dụng cho thư mục được chỉ định.


Tôi nghĩ bạn có ý -maxdepth 1hơn là-maxdepth 0
Mark Longair

5
Cần phải chỉ ra rằng ký tự đại diện là phần quan trọng ở đây, không phải ls. Bạn có thể tìm thấy các tệp tương tự với echohoặc wchoặc những gì có bạn, vì trình bao mở rộng ký tự đại diện cho bạn. Vì vậy, for file in /dev/abc-*; do something with each "$file"; donecó thể là những gì OP thực sự đang tìm kiếm.
tripleee

1
À, tôi không bao giờ có thể nhớ nó đi theo hướng nào ... Cảm ơn vì đã chỉnh sửa. Ngoài ra, đáng lưu ý rằng nó không phải là phổ quát. Phiên bản Solaris findkhông có nó chẳng hạn.
Stephen Darlington

@tripleee +1. Vâng Làm tất cả trong vỏ sẽ thích hợp hơn nếu có thể.
Stephen Darlington

1
@MustafaOzturk Điều lsnày là thừa. for f in abc*; ...là tất cả những gì bạn cần.
Stephen Darlington

4

Điều này có thể làm những gì bạn muốn:

find /dev \( ! -name /dev -prune \) -type f -print

2
Vâng, điều này hoạt động. -maxdepth không được triển khai trong tìm kiếm trên một số Unix cũ.
CCTO

-1
find /dev -maxdepth 1 -name 'abc-*'

Không làm việc cho tôi. Nó không trả lại gì cả. Nếu tôi chỉ làm '.' nó cung cấp cho tôi tất cả các tệp trong thư mục bên dưới tệp tôi đang làm việc.

find /dev -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls

Không trả lại gì với '.' thay vào đó tôi nhận được danh sách tất cả các tệp 'lớn' trong thư mục của mình cũng như thư mục gốc / thư mục nơi tôi lưu trữ các tệp cũ.

Tiếp tục. Những công việc này.

find ./ -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls
564751   71 -rw-r--r--   1 snyder   bfactory   115739 May 21 12:39 ./R24eTightPiPi771052-55.root
565197  105 -rw-r--r--   1 snyder   bfactory   150719 May 21 14:27 ./R24eTightPiPi771106-2.root
565023   94 -rw-r--r--   1 snyder   bfactory   134180 May 21 12:59 ./R24eTightPiPi77999-109.root
719678   82 -rw-r--r--   1 snyder   bfactory   121149 May 21 12:42 ./R24eTightPiPi771098-10.root
564029  140 -rw-r--r--   1 snyder   bfactory   170181 May 21 14:14 ./combo77v.root

Rõ ràng /dev có nghĩa là thư mục quan tâm. Nhưng ./là cần thiết, không chỉ .. Nhu cầu về điều /đó không rõ ràng ngay cả sau khi tôi tìm ra điều gì /devcó nghĩa là nhiều hay ít.

Tôi không thể trả lời như một bình luận vì tôi không có "danh tiếng".


1
Bạn có được danh tiếng bằng cách đưa ra câu trả lời tốt. Vui lòng đọc stackoverflow.com/conduct
aifrim

Có những lý do bạn không được phép bình luận và điều đó cho phép bạn không cho phép bình luận ở đây trong phần Trả lời. Hãy xóa cái này.
Cướp
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.