2014-10-07 100 views
13

是否可以將find的結果傳遞給COPY命令cp是否可以將FIND的結果傳遞給COPY命令CP?

像這樣:

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

求是,我總是覺得這種公式such as from this post的:

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

這就產生了一些問題:

  1. 你爲什麼不能只是使用|管?這不是它的目的嗎?
  2. 爲什麼大家都推薦-exec
  3. 我怎麼知道何時使用那個(exec)管道|
+3

'cp'不接受stdin afaik。 – user2864740 2014-10-07 10:43:25

+0

[Bash:find and copy]的可能重複(http://stackoverflow.com/questions/1562102/bash-find-and-copy)。 – BroSlow 2014-10-07 11:16:31

+0

假設你的'find'具有'-exec ... +',並且你通過pipe/xargs保護你的文件名,那麼你使用哪一個真的不重要。如果你的'find'沒有'-exec ... +',那麼對於任何可以帶多個文件名參數的命令,都應該小心使用pipe/xargs。 – BroSlow 2014-10-07 11:25:26

回答

15

好問題!

  1. 爲什麼不能使用|管?這不是它的目的嗎?

可以通過管道,當然,xargs針對這些情況下完成的:

find . -iname "*.SomeExt" | xargs cp Destination_Directory/ 
  • 爲什麼大家推薦-exec
  • -exec是好的,因爲它提供了更多的控制你準確的執行。每當你管有可能是極端情況的問題:含有空格的文件名或新的生產線,等等。

  • 我怎麼知道什麼時候使用(執行)在管| ?
  • 這是真的取決於你,可以有很多情況。只要執行的動作很簡單,我就會使用-exec。我不是xargs是很好的朋友,我傾向於選擇其中find輸出提供給while循環的方法,如:

    4

    您可以使用|象下面這樣:

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

    回答您的問題:

    • |可以用來解決這個問題。但是如上所見,它涉及很多代碼。此外,|將創建兩個過程 - 一個爲find,另一個爲cp

    • 而是使用exec()而不是find將在單個過程中解決問題。

    12

    有用於cp一個很少使用的選項:-t destination - 請參見手冊頁:

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

    試試這個:

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

    但如果是白色的空間的文件名。

    相關問題