UNIX tìm các thư mục chứa một tệp cụ thể (pom.xml) sau đó thực thi lệnh trong thư mục đó


4

Tôi muốn, từ một thư mục gốc, tìm tất cả các thư mục có chứa một tên tệp nhất định (pom.xml), sau đó cd đến thư mục đó và thực hiện một lệnh. Tôi có thể làm điều này trong một kịch bản nhưng tôi đã hy vọng làm điều này với một dòng lệnh duy nhất.

cho đến nay tôi có

find . -type f -name 'pom.xml' |sed 's#\(.*\)/.*#\1#'

Điều này cung cấp các thư mục tôi cần ... bây giờ tôi cần cd vào từng thư mục và thực hiện lệnh của mình

unix  find  script 

Tại sao bạn cần cd vào thư mục để thực hiện lệnh của bạn? Chỉ cần thực hiện lệnh trên/path/to/pom.xml

Câu hỏi này nói rõ rằng bạn không viết bất kỳ loại kịch bản shell nào, nó thuộc về siêu người dùng
Tim Post

1
@tim anh ấy đang cố gắng tránh lập trình, điều mà bất kỳ lập trình viên nào cũng nghĩ đến đầu tiên;)
sfussalanger

@ dnagirl lệnh đang thực thi một tập lệnh tạo các thư mục mới, v.v. trong thư mục với tệp pom.xml @ muốn là một lớp lót để dễ phân phối

Câu trả lời:


6

tìm có -exec và -execdir. Đối với bản dựng maven, bạn sẽ làm

# executes `mvn clean install` in any directory where pom.xml was found
find . -name pom.xml -execdir mvn clean install \;

-execdirlà chính xác những gì cần thiết.
William Jackson

2

Điều này sẽ tìm thấy các thư mục:

find . -name pom.xml -printf '%h\n'

sau đó bạn có thể đọc các thư mục và chạy lệnh của bạn:

find . -name pom.xml -printf '%h\n' | while read dir; do ( cd "$dir"; command ... ) done

Nếu bạn hoang tưởng về các dòng mới được nhúng trong tên thư mục (và nghiêm túc, có vấn đề gì với mọi người?), Bạn có thể sử dụng "\ 0" trong printf, sau đó sử dụng xargsđể chạy lệnh:

find . -name pom.xml -printf '%h\0' | xargs -0 -L 1 sh -c 'dir="$0"; cd "$dir"; command ...'

1

cũng có:

find . -type f -exec mvn -f {} clean install \;

Tuy nhiên, tôi nghĩ bạn nên xem xét các tùy chọn Maven có sẵn để làm điều này. Mặc dù nó không còn xuất hiện trong Maven 3.x, Maven 2.x có -rtùy chọn thực hiện chính xác điều này. Cách tốt hơn là tạo một tập hợp pom.xmlcó chứa các tệp mong muốn dưới dạng các mô-đun và sau đó bạn có thể sử dụng -rf-plchọn lọc để chọn xây dựng.


1

Nếu điều bạn muốn là áp dụng các thuộc tính svnignore dựa trên một tệp mà bạn không biết đường dẫn tuyệt đối bạn có thể sử dụng:

#!/bin/sh
find -name pom.xml -execdir pwd \; | while read project_dir
do
svn propset svn:ignore -F support-tools/svn/svnignore.cfg $project_dir
done

Tôi sử dụng dự án này trong các dự án hiện tại của mình, vì mỗi nhà phát triển có thanh toán svn trên một vị trí khác nhau và nó không thay đổi thư mục làm việc để thực hiện lệnh svn. Đối với mục đích khác sử dụng

find -name -execdir

0

Làm thế nào về:

find / -type f -name 'pom.xml' -print | while read FILE; do cd `dirname ${FILE}` && /run/my/script; done

Nếu bạn có thể thay đổi tập lệnh để nó lấy một thư mục làm đối số thì phần sau sẽ hoạt động:

find / -type f -name 'pom.xml' -exec /run/my/script `dirname {}` \;

0

Để tìm các thư mục duy nhất chứa một loại tệp nhất định, bạn có thể sử dụng:

find . -type f -name *.png | sed 's#\(.*\)/.*#\1#' | uniq

Điều này sẽ liệt kê tất cả các thư mục duy nhất bao gồm các tệp PNG.


Đây là một câu trả lời hợp lý - một khác nhau câu hỏi. Điều này chỉ có mối quan hệ mỏng nhất cho câu hỏi thực sự được hỏi ở đây.
Scott

0

Bạn có thể sử dụng xargs:

 xargs -- construct argument list(s) and execute utility

TÓM TẮC

  xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr]
        [-L number] [-n number [-x]] [-P maxprocs] [-s size]
        [utility [argument ...]]

SỰ MIÊU TẢ

 The xargs utility reads space, tab, newline and end-of-file delimited
 strings from the standard input and executes utility with the strings
 as arguments.

 Any arguments specified on the command line are given to utility upon
 each invocation, followed by some number of the arguments read from the
 standard input of xargs.  The utility is repeatedly executed until stan-
 dard input is exhausted.
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.