如何在shell的目錄中同時使用grep和mv?

如何在shell的目錄中同時使用grep和mv?

如何 grep 目錄中所有檔案的內容作為“TEST”,然後將這些檔案移至不同的目錄(例如主目錄)?

答案1

你可以結合grep尋找對於此任務:

find SOURCE -maxdepth 1 -type f -exec grep -q TEST {} \; -exec mv -i {} DEST \;

怎麼運作的

  • find SOURCE -maxdepth 1 -type f-type f尋找目錄中的所有檔案 ( )來源

    如果您還想在子目錄中包含文件,只需刪除-maxdepth 1.

  • -exec grep -q TEST {} \;grep 一個接一個地查找檔案中的字串測試。這裡,{}是目前正在處理的文件。

    這個-q開關使 grep “安靜”,即它不會輸出任何內容。若滿足以下條件,則-exec陳述為真:grep成功,即找到該字串。

  • -exec mv -i {} DEST \;移動包含該字串的文件測試進入目錄德斯特

    開關-i品牌MV“互動式”,即覆蓋其他文件之前會提示。

答案2

只是另一種選擇(不過,這需要一些 GNU 特定的擴展;因為您標記了問題“Unix”,所以它可能不適合您):

grep -lZd skip TEST SOURCE/* | xargs -0I{} mv -i {} DEST
  • grep -l

    列印匹配的檔案名稱而不是正常輸出。

  • grep -Z

    給出空字節分隔的輸出,這是透過管道處理奇怪檔案名稱的安全選擇。

  • grep -d skip

    定義skip輸入參數中遇到的目錄的操作。

    這並不是真正需要的;它只是避免遇到目錄時的通知grep: SOURCE/DIR: Is a directory。如果您想遞歸讀取目錄中的文件,請使用操作recurse,甚至更短的等效-r開關(也請參見下面的點)。

  • SOURCE/*

    SOURCE使用 shell來匹配目錄中的所有文件通配。隱藏檔案預設不符;這可以透過在發出命令shopt -s dotglob之前在 Bash 中設定來更改。grep

    人們可能會想只添加SOURCE/.*到輸入參數中,但是如果與 with 一起使用,這可能會產生意想不到的後果-r(因為我們匹配.and ..)。

    如果需要遞歸匹配,只需使用-r SOURCE不帶文件通配符作為輸入參數,其中包括目錄結構中的隱藏文件。

  • xargs -0

    將輸入解釋為空分隔。

  • xargs -I{}

    定義{}為輸入參數的佔位符。

  • mv -i

    根據丹尼斯的建議,使移動具有互動性,以避免錯誤。

要測試此模式(或一般命令),一種有用的技術是echo在實際命令之前插入以查看要執行哪些命令,即更改mvecho mv.

答案3

$ mv TEST* /路徑/到/目的地

對我有用,希望對你有用。就我而言,是:

$ mv note_[5,6]* ~/文檔/筆記

將 note_5_math.pdf 和 note_6_math.pdf 移到 home/documents/notes 目錄。

相關內容