2013-10-17 26 views
1

對於Linux中的腳本編程來說是新手,所以我希望這很簡單。我需要將包含多個文件的目錄移動到另一個位置,如果該目錄包含一個帶有特定文本的文件。用於移動包含文件的目錄的Linux腳本

我有一個命令,讓我到這裏來匹配我的標準目錄的列表:

find . -name 'file.name' -print0 | xargs -0 grep -l "foo" | sed 's#\(.*\)/.*#\1#' | sort -u 

現在我只需要利用這個結果,並與可執行腳本內的mv命令將它們結合起來。

+0

爲什麼sed和排序? – anubhava

回答

3

您可以使用xargs與替換,以獲得預期的效果:

commands to get directory list | xargs -i mv "{}" <destination> 
+0

這個最終成爲我的解決方案,因爲它可以輕鬆地處理帶有空格和特殊字符的目錄名稱,謝謝 –

2

假設所有的出來您發佈的管道是目錄名稱:

$target=/home/me/example 
find . -name 'file.name' -print0 | 
xargs -0 grep -l "foo" | 
sed 's#\(.*\)/.*#\1#' | 
while read line #line is a variable with the contents of one line 
do 
    mv $line $target 
done 

哦,擺脫那種-u 沒有必要爲它移動的目錄和它的序列化'你的管道,你不能排序,直到發現完成,所以這些動作不會開始,沒有它的動作可以開始爲第一個項目被找到時的SOON。

+0

真棒,完美工作,謝謝! –

+0

好吧,它的工作,直到我的目錄有他們的名字中的空格...結束了與下面的xargs選項 –

+0

'mv「$ line」「$ target」'但同意xargs選項在這裏更好 這雖然讀結構_can_對複雜的處理很有用,但我需要使用xargs更多 – tolanj

0

backtick operator評估命令,並將就好像你進入它的命令行上stdout。所以,在你的情況:

相關問題