2012-11-05 23 views
6

Tôi muốn chuyển danh sách đầu ra của các phần tử của lệnh dưới dạng tham số của lệnh khác. Tôi đã tìm thấy một số trang khác:Đầu ra lệnh Linux dưới dạng tham số của lệnh khác

nhưng họ dường như phức tạp hơn.

Tôi chỉ muốn sao chép tệp vào mọi kết quả của cuộc gọi đến lệnh Linux find.

là gì sai ở đây ?:

find . -name myFile 2>&1 | cp /home/myuser/myFile $1 

Cảm ơn

Trả lời

16

Đây là những gì bạn muốn:

find . -name myFile -exec cp /home/myuser/myFile {} ';' 

Một sự cố/giải thích về điều này:

  • find: viện dẫn tìm lệnh
  • .: bắt đầu tìm kiếm từ thư mục làm việc hiện hành.
  • Vì không có cờ sâu được quy định, điều này sẽ tìm kiếm một cách đệ quy cho tất cả các thư mục con
  • -name myFile: tìm tập tin có tên rõ ràng myFile
  • -exec: cho kết quả tìm kiếm, thực hiện lệnh bổ sung với họ
  • cp /home/myuser/myFile {}: bản sao /home/myuser/myFile để ghi đè lên mỗi kết quả được trả về bởi find; hãy nghĩ về số {} là nơi mỗi kết quả tìm kiếm sẽ xuất hiện.
  • ';': sử dụng để tách các lệnh khác nhau được chạy sau khi find
+0

Chỉ cần thay đổi thứ tự {} thành vị trí thứ hai, sau/home/myuser/myFile và nó sẽ hoạt động. Cảm ơn. –

+0

@ LuisAndrésGarcía, ah, tôi có thể đã hiểu lầm bạn - bạn muốn sao chép một tệp '/ home/myuser/myFile' để ghi đè lên bất kỳ' myFile' nào được tìm thấy bằng 'find' trong cwd? –

+0

Bạn đã đúng! :) Một ví dụ khác, để liệt kê các thuộc tính của bất kỳ tệp được tìm thấy nào là: find -exec ls -l {} ';' –

2

Các ống sẽ gửi kết quả của một chương trình để đầu vào của người khác. cp không đọc từ luồng đầu vào của nó tại thiết bị đầu cuối, nó chỉ sử dụng các đối số trên dòng lệnh.

Bạn muốn sử dụng xargs với đường ống hoặc đối số 's thay vì đường ống.

+2

Bạn có thể cho một ví dụ , xin vui lòng? Cảm ơn nhiều. –

3

Có một vài cách để giải quyết việc này, tùy thuộc vào việc bạn cần phải lo lắng về các file có khoảng trắng hoặc ký tự đặc biệt khác trong tên của họ.

Nếu không có tên tệp nào có dấu cách hoặc ký tự đặc biệt (chúng chỉ bao gồm chữ cái, số, dấu gạch ngang và dấu gạch dưới), thì sau đây là giải pháp đơn giản sẽ hoạt động. Bạn có thể sử dụng $(command) để thực thi lệnh và thay thế kết quả vào đối số của lệnh khác. Trình bao sẽ chia kết quả trên dấu cách, tab hoặc dòng mới và for gán mỗi giá trị cho $f lần lượt và chạy lệnh trên mỗi giá trị.

for f in $(find . -name myFile) 
do 
    cp something $f 
done 

Nếu bạn có không gian hoặc tab, bạn có thể sử dụng tùy chọn của tìm kiếm -exec. Bạn vượt qua -exec command args, đặt {} nơi bạn muốn tên tệp được thay thế và kết thúc các đối số bằng một số ;. Bạn cần báo giá số {}; để vỏ không diễn giải chúng.

find . -name myFile -exec cp something "{}" \; 

Đôi khi -exec không đủ. Ví dụ: trong this question, họ muốn sử dụng mở rộng tham số Bash để tính toán tên tệp. Để thực hiện điều đó, bạn cần phải vượt qua -exec bash -c 'your command', nhưng sau đó bạn sẽ gặp phải sự cố trích dẫn với sự thay thế {}. Để giải quyết điều này, bạn có thể sử dụng -print0 từ find để in các kết quả phân định với các nhân vật null (mà là không hợp lệ trong tên tập tin), và ống nó vào một vòng lặp while read để tách các thông số trên null:

find . -name myFile -print0 | (while read -d $'\0' f; do 
    cp something "$f" 
    done)