如何 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
在實際命令之前插入以查看要執行哪些命令,即更改mv
為echo mv
.
答案3
$ mv TEST* /路徑/到/目的地
對我有用,希望對你有用。就我而言,是:
$ mv note_[5,6]* ~/文檔/筆記
將 note_5_math.pdf 和 note_6_math.pdf 移到 home/documents/notes 目錄。