Text-Processing
Grep 文件中的單詞然後復製文件
我有一組文件(.zip、.txt、.tar.gz、.doc、…等)。這些文件駐留在路徑中。我想找到所有文件(*.txt),然後只複製包含特定單詞的文本文件(例如 LINUX/UNIX)。
我執行了以下內容:
find . -name "*.txt" | grep 'LINUX/UNIX'
此命令能夠找到所有文本文件,然後“grep”通過僅列出包含“LINUX/UNIX”的文本文件來過濾結果文本文件。
如何將這些最終文件(即包含“LINUX/UNIX”的文本文件)複製到選擇的特定路徑?
我試圖申請
xargs
find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>
但它沒有用
嘗試:
grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0r cp -t /path/to/dest
因為此命令使用 NUL 分隔,所以它對所有文件名都是安全的,包括那些包含空格、製表符甚至換行符的難命名的文件名。
以上需要 GNU
cp
。對於 MacOS/FreeBSD,請嘗試:grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0 sh -c 'cp "$@" /path/to/dest' sh
這個怎麼運作:
grep
選項和參數
-r
告訴 grep 遞歸搜尋目錄結構。(在 FreeBSD 上,-r
將跟隨符號連結進入目錄。對於 OS/X 或最新版本的 GNU 都不是這樣grep
。)--include '*.txt'
告訴 grep 僅返回名稱與 glob 匹配的文件*.txt
(包括隱藏的文件,如.foo.txt
or.txt
)。-l
告訴 grep 只返回匹配文件的名稱,而不是匹配項本身。--null
告訴 grep 使用 NUL 字元來分隔文件名。(--null
受grep
GNU /Linux、MacOS和FreeBSD支持,但不支持 OpenBSD。)LINUX/UNIX
告訴 grep 只查找內容包含正則表達式的文件LINUX/UNIX
.
在目前目錄中搜尋。您可以在最新版本的 GNU 中省略它grep
,但是您需要傳遞一個--
選項終止符來cp
防止以 . 開頭的文件名-
。
xargs
選項和參數
-0
告訴 xargs 期待 NUL 分隔的輸入。-r
告訴 xargs 除非找到至少一個文件,否則不要執行該命令。(此選項在 BSD 或 OSX 上都不需要,並且與 OSX 的xargs
.)不兼容。)cp -t /path/to/dest
將目錄複製到目標目錄。(-t
需要 GNUcp
。)