Text-Processing

Grep 文件中的單詞然後復製文件

  • January 9, 2019

我有一組文件(.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

這個怎麼運作:

  1. grep選項和參數
  • -r告訴 grep 遞歸搜尋目錄結構。(在 FreeBSD 上,-r將跟隨符號連結進入目錄。對於 OS/X 或最新版本的 GNU 都不是這樣grep。)
  • --include '*.txt'告訴 grep 僅返回名稱與 glob 匹配的文件*.txt(包括隱藏的文件,如.foo.txtor .txt)。
  • -l告訴 grep 只返回匹配文件的名稱,而不是匹配項本身。
  • --null告訴 grep 使用 NUL 字元來分隔文件名。(--nullgrepGNU /LinuxMacOSFreeBSD支持,但不支持 OpenBSD。)
  • LINUX/UNIX告訴 grep 只查找內容包含正則表達式的文件LINUX/UNIX
  • .在目前目錄中搜尋。您可以在最新版本的 GNU 中省略它grep,但是您需要傳遞一個--選項終止符來cp防止以 . 開頭的文件名-
  1. xargs選項和參數
  • -0告訴 xargs 期待 NUL 分隔的輸入。
  • -r告訴 xargs 除非找到至少一個文件,否則不要執行該命令。(此選項在 BSD 或 OSX 上都不需要,並且與 OSX 的xargs.)不兼容。)
  • cp -t /path/to/dest將目錄複製到目標目錄。(-t需要 GNU cp。)

引用自:https://unix.stackexchange.com/questions/297006