
我使用的是 Oracle Solaris。
我在用:
grep "searchstring" filename.*
上面的命令返回我的搜尋結果。
現在我想將上面搜尋結果中的所有檔案(不是搜尋結果的所有檔案)移到特定目錄中../mydir/
。
如何在一個命令中完成此操作(搜尋和移動都應在一行命令中完成)。
答案1
從ksh
, bash
or /usr/xpg4/bin/sh
,假設檔名不包含換行符,您可以在(grep -l
的輸出上使用 split+glob 運算符-l
我是匹配的文件)。
透過離開來呼叫該運算符命令替換(`...`
或$(...)
) 不加引號。在這裡,我們使用特殊變數對其進行調整,$IFS
以說明我們要分割哪個字元(此處為換行符),並透過停用該glob
部分set -f
:
IFS='
'
set -f
mv $(set +f; grep -l searchstring filename*) ../mydir/
(我們恢復通配符裡面用於擴展filename*
) 的命令替換(在子 shell 中運行)。
您可以將其簡化為:
mv $(grep -l searchstring filename*) ../mydir/
如果您知道檔案名稱不包含空格、製表符、換行符、*
或?
字元[
。上面的分割是在換行符、空格和製表符(這是 的預設值$IFS
)上完成的,並且對分割結果的每個單字執行通配符(但如果沒有檔案名稱包含通配符,則這不是問題)。
如果您無法保證檔案名稱不包含換行符,您可以使用循環:
for f in filename*; do
grep -q searchstring "$f" && mv "$f" ../mydir/
done