2014-10-07 14 views
13

Có thể kết quả đường ống của find thành lệnh COPY cp không?Có thể nối kết quả của FIND với lệnh CP COPY không?

Như thế này:

find . -iname "*.SomeExt" | cp Destination Directory 

Tìm kiếm, tôi luôn luôn tìm thấy loại thức such as from this post:

find . -name "*.pdf" -type f -exec cp {} ./pdfsfolder \; 

Điều này đặt ra một số câu hỏi:

  1. Tại sao không thể bạn chỉ cần sử dụng | ống ? không phải là những gì nó cho?
  2. Tại sao mọi người đề xuất -exec
  3. Làm cách nào để biết khi nào nên sử dụng (exec) trên đường ống |?
+3

'cp' không chấp nhận stdin afaik. – user2864740

+0

có thể trùng lặp của [Bash: find and copy] (http://stackoverflow.com/questions/1562102/bash-find-and-copy). – BroSlow

+0

Giả sử 'tìm' của bạn có' -exec ... + 'và bạn bảo vệ tên tệp của mình trên đường ống/xargs, nó thực sự không quan trọng bạn sử dụng. Nếu 'find' của bạn không có' -exec ... + ', thì một ống/xargs cẩn thận nên luôn được ưa thích với bất kỳ lệnh nào có thể lấy nhiều đối số tên tệp. – BroSlow

Trả lời

15

Câu hỏi hay!

  1. tại sao bạn không thể sử dụng | ống? không phải là những gì nó cho?

Bạn có thể đường ống, tất nhiên, xargs được thực hiện cho những trường hợp này:

find . -iname "*.SomeExt" | xargs cp Destination_Directory/ 
  1. Tại sao tất cả mọi người đề nghị exec

-exec là tốt vì nó cung cấp quyền kiểm soát chính xác hơn những gì bạn tạo e thực thi. Bất cứ khi nào bạn ống có thể có vấn đề với trường hợp góc: tên tập tin chứa dấu cách hoặc dòng mới, vv

  1. làm thế nào để biết khi nào cần sử dụng (exec) qua ống | ?

Điều này thực sự tùy thuộc vào bạn và có thể có nhiều trường hợp.Tôi sẽ sử dụng -exec bất cứ khi nào hành động thực hiện rất đơn giản. Tôi không phải là một người bạn rất tốt của xargs, tôi có xu hướng thích một cách tiếp cận trong đó find đầu ra được cung cấp cho một vòng lặp while, chẳng hạn như:

4

Bạn có thể sử dụng | như dưới đây:

find . -iname "*.SomeExt" | while read line 
do 
    cp $line DestDir/ 
done 

Trả lời câu hỏi của bạn:

  • | thể được sử dụng để giải quyết vấn đề này. Nhưng như đã thấy ở trên, nó liên quan đến rất nhiều mã. Hơn nữa, | sẽ tạo hai quy trình - một cho find và một quy trình khác cho cp.

  • Thay vào đó, sử dụng exec() bên trong find sẽ giải quyết sự cố trong một quy trình.

12

Có một tùy chọn ít được sử dụng cho cp: -t destination - xem man page:

find . -iname "*.SomeExt" | xargs cp -t Directory 
0

Hãy thử điều này:

find . -iname "*.SomeExt" **-print0** | xargs **-0** cp -t Directory 

Trong trường hợp có màu trắng không gian trong tên tập tin.

Các vấn đề liên quan