Làm thế nào để sử dụng `find -exec` để thực thi lệnh trong thư mục của tệp tìm thấy (không phải thư mục hiện tại)?


14

Hãy nói rằng tôi đang ở trong một thư mục trong đó có một số thư mục con, dir1, dir2, và dir3. Mỗi thư mục này có một tệp foovà tôi muốn thực hiện cùng một lệnh trên mỗi foothư mục và thực hiện lệnh đó từ bên trong thư mục đó.

Nếu tôi làm "bằng tay", nó sẽ trông giống như thế này:

cd dir1
(execute on foo)
cd ../dir2
(execute on foo)
cd ../dir3
(execute on foo)

Điều bắt buộc là lệnh được thực thi từ mỗi thư mục . foolà một tập lệnh lập lịch hàng loạt (đối với HTCondor, nếu bạn quan tâm muốn biết) và phải được thực thi từ mỗi thư mục con để đầu ra của các lần chạy được bắt đầu bởi các tập lệnh lập lịch sẽ kết thúc trong mỗi thư mục con.

Câu hỏi " Tìm tệp và thực thi lệnh trong thư mục của tệp ", theo như tôi có thể nói, không trả lời câu hỏi của tôi. Câu trả lời đầu tiên cho câu hỏi đó là một cách giải quyết không hiệu quả trong trường hợp của tôi và câu trả lời thứ hai không có đủ lời giải thích để tôi biết cách sử dụng nó.


@roaima, vui lòng giải thích nó là một bản sao. Câu trả lời đầu tiên của câu hỏi đó không giúp ích gì cho tôi, đó là một công việc xung quanh và câu trả lời thứ hai không có ý nghĩa gì với tôi. Nó cần giải thích thêm cho tôi để biết làm thế nào để sử dụng nó.
Neutronstar

Câu trả lời:


22

Giả sử findhỗ trợ của bạn , sử dụng -execdirtùy chọn thay vì-exec

find * -name 'foo' -execdir pwd \;

Nếu không, vui lòng cung cấp chi tiết về nền tảng và / hoặc phân phối của bạn (nếu phù hợp).


Khi bạn bắt đầu nhấn "tìm: Các đường dẫn tương đối' ./node_modules/.bin' được bao gồm trong biến môi trường PATH,": askubuntu.com/questions/621132/...
Ciro Santilli冠状病毒审查六四事件法轮功

Xin lỗi nếu tôi có thể viết nó như vậy, nhưng -execdir (trên Ubuntu) thật tệ, vì nó không mang lại cho bạn {}, mà là cha mẹ của {}.
uav

1
@uav mà không biết trường hợp sử dụng của bạn tôi không thể giúp bạn. Nhưng để đáp lại ý kiến ​​của bạn, tài liệu ghi rõ " Thích -exec, nhưng lệnh được chỉ định được chạy từ thư mục con chứa tệp phù hợp ".
roaima

Vâng, đúng, đó là trường hợp đặc biệt nếu bạn đang tìm kiếm -type d (= thư mục) và sau đó nó là tối ưu phụ.
uav

Không biết trường hợp sử dụng của bạn, tôi không thể giúp bạn.
roaima

3

Giả sử bạn biết chính xác thư mục nào để chạy lệnh của bạn,

for dir in dir1 dir2 dir3; do
    ( cd "$dir" && somecommand foo )
done

hoặc, lặp qua các footập tin,

for foo in */foo; do
  ( cd "${foo%/*}" && somecommand foo )
done

Subshell ngăn chặn cdảnh hưởng đến thư mục làm việc của phần còn lại của tập lệnh. Thay ${foo%/*}thế tham số mở rộng thành tên của thư mục chứa footệp (bằng cách xóa mọi thứ sau /giá trị cuối cùng $foo).

Sử dụng tiêu chuẩn findđể làm điều tương tự (trong trường hợp các footệp có thể nằm sâu trong cấu trúc thư mục):

find . -type f -name foo -exec sh -c '
    for foo do
        ( cd "${foo%/*}" && somecommand foo )
    done' sh {} +

Bằng từ: Tìm tất cả các tệp thông thường được gọi là "foo" ở bất kỳ đâu trong thư mục hiện tại hoặc bên dưới và đặt tên đường dẫn của chúng cho tập lệnh shell này theo lô. Tập lệnh shell sẽ lặp lại trên các tên đường dẫn đã cho, thay đổi thư mục thành phần thư mục của mỗi tên đường dẫn và nếu điều đó thành công, hãy thực thi somecommand foo.

Đối với một giải pháp sử dụng phi tiêu chuẩn -execdir, xem câu trả lời của roaima . Câu trả lời của anh ấy phù hợp với ví dụ của tôi:

find . -type f -name foo -execdir somecommand foo ';'
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.