2014-06-13 84 views
0

首先,我試圖在Google和Stackoverflow搜索類似的主題,但我沒有發現任何類似的東西。管道分岔在殼

問題:

有什麼辦法來處理pipeling殼分叉?

例:

我有以下目錄樹:

> 1 
>> 1.a 
>> 2.a 
>> 3.a 
> 2 
>> 1.b 
>> 2.b 
>> 3.b 

當我執行命令:

ls -1 */* | nl 

我得到以下輸出:

1 1/1.a 
2 1/2.a 
3 1/3.a 
4 2/1.b 
5 2/2.b 
6 2/3.b 

如果我想參考第一列,我會用-f1參數使用cut。以同樣的方式,如果我想參考第二列,我會使用-f2參數。我能以某種方式使用下面的命令嗎?

ls -1 */* | nl | mv `cut -d' ' -f1` `cut -d' ' -f2` 

我不介意重命名文件的方式。我實際上想知道shell中是否存在並行流水線。

+3

你想在這裏實現什麼?如果我解釋'mv',看起來你正在嘗試做一些類似'mv 1 1.a'的事情。你的意思是「mv 1.a 1」嗎? –

+0

對不起,我忘了目錄前綴,所以它會是:'mv 1/1.a 1' – displayer

回答

1

您可以使用此for循環:

while read -r f1 f2; do 
    [[ -n "$f1" && -n "$f2" ]] && mv "$f1/$f2" "$f2" 
done < <(ls -1 */* | nl) 

這裏是一個非bash腳本

ls -1 */* | nl | while read -r f1 f2; do 
    [ -n "$f1" ] && [ -n "$f2" ] && mv "$f1/$f2" "$f2" 
done 
+0

因爲OP使用了'BASH'標籤,所以最好使用'[[...]]'而不是舊的'[']' – anubhava

+0

@GoodPerson:使用'[[','&&'是一個不可用'['(這可能是你所倡導的)'的選項。由於該問題被標記,因此僅Bash解決方案就可以,但由於它也被標記爲Shell,所以更接近中性的解決方案也會很好。 –

+2

即使可移植性是一個問題,POSIX規範本身建議''-n「$ f1」] && [-n「$ f2」]''-n「$ f1」-a -n「$ f2」] '。 – chepner