Loại trừ thư mục trong tìm


11

Làm cách nào tôi có thể tìm thấy mọi tệp và thư mục khớp với một mẫu, ngoại trừ một thư mục bằng cách sử dụng find?

Nói rằng tôi có cấu trúc tập tin sau đây;

.
  foo-loại trừ tôi /
    foo.txt
  foo-loại trừ tôi-không /
    foo.txt
  quán ba/
    foo.txt
    foobar /
      bar.txt
      foooo.txt

Làm thế nào tôi có được đầu ra sau bằng cách sử dụng find:

./bar/foo.txt
./bar/foobar
./bar/foobar/foustoo.txt
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

Tôi đã thử sử dụng cả hai lệnh sau:

tìm thấy . -name 'foo-loại trừ tôi' -prune -o -name 'foo *'
tìm thấy . -tên 'foo *' \! -path './foo-exclude-me/*'

nhưng cả hai đều trả lại cái này:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

Làm thế nào tôi có thể loại trừ đúng foo-exclude-methư mục?


Hãy thử sử dụng foo-exclude-methay vì ./foo-exclude-me. Cũng thử nối thêm -printvào cuối lệnh.
n0pe

@MaxMackie hoàn hảo :)
Tyilo

Nó sửa chưa? Đó là bản sửa lỗi làm việc cho bạn? Tôi có thể đặt nó trong một câu trả lời thay vì một bình luận.
n0pe

@MaxMackie sử dụng cả hai -printfoo-exclude-methay vì ./foo-exclude-me.
Tyilo

Tuyệt vời, có vẻ như Gilles đã đánh bại tôi mặc dù vậy :)
n0pe

Câu trả lời:


11
find . -name 'foo-exclude-me' -prune -o -name 'foo*' -print

Không -print, hành động mặc định ngầm định áp dụng cho mọi trận đấu, ngay cả những trận đấu được cắt tỉa. Rõ ràng -printchỉ áp dụng trong các điều kiện được chỉ định, mà -name 'foo*'chỉ trong nhánh khác của -name 'foo-exclude-me'.

Nói chung, sử dụng một cách rõ ràng -printbất cứ khi nào bạn đang làm một cái gì đó phức tạp hơn một tổ hợp các vị từ.

Lần thử thứ hai của bạn ! -path './foo-exclude-me/*'không hoạt động vì ./foo-exclude-mekhông khớp ./foo-exclude-me/*(không có dấu /). Thêm ! -path ./foo-exclude-mesẽ làm việc.


-2
-bash-4.1 $ tìm. -exec ls -l {} + -name 'a.out' -prune -o -name '*' -exec rm -f {} + -exec ls -l {} +

-rw-r - r--. 1 oradba dba 499 ngày 18 tháng 1 19:30 ./a.out
-rw-r - r--. 1 oradba dba 499 ngày 18 tháng 1 20:59 ./b.out
-rw-r - r--. 1 oradba dba 499 ngày 18 tháng 1 20:59 ./c.out
-rw-r - r--. 1 oradba dba 499 ngày 18 tháng 1 20:59 ./d.out

.:
tổng số 16
-rw-r - r--. 1 oradba dba 499 ngày 18 tháng 1 19:30 a.out
-rw-r - r--. 1 oradba dba 499 ngày 18 tháng 1 20:59 b.out
-rw-r - r--. 1 oradba dba 499 ngày 18 tháng 1 20:59
-rw-r - r--. 1 oradba dba 499 ngày 18 tháng 1 20:59 d.out
rm: không thể xóa `. ': Là một thư mục
ls: không thể truy cập ./b.out: Không có tệp hoặc thư mục như vậy
ls: không thể truy cập ./d.out: Không có tệp hoặc thư mục như vậy
ls: không thể truy cập ./c.out: Không có tệp hoặc thư mục như vậy
.:
tổng số 4
-rw-r - r--. 1 oradba dba 499 ngày 18 tháng 1 19:30 a.out


Đã sử dụng tùy chọn prune để bỏ qua a.out và hoạt động tốt - art.s
user211226

Bạn hoàn toàn không giải thích tại sao -prunecó liên quan. -prunelà một trong những tùy chọn phức tạp nhất để find'khiến nó vô hiệu hóa -print(được bật theo mặc định)
hóa học

-prune Đúng; nếu tập tin là một thư mục, đừng đi vào nó - Vì vậy, nó sẽ không hoạt động chính nó vào các thư mục như là một bảo vệ. - art.s
user211226
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.