2012-04-20 60 views
4
我在使用GNU並行( http://www.gnu.org/software/parallel/

正則表達式中括號(大括號) - GNU並行/ xargs的/發現

我有四個文件的列表,用大括號的麻煩(大括號)

file1.txt.super 
file2.txt.super 
file3.txt.super 
file4.txt.super 

如果我發出:ls * | parallel "mkdir ./{.}"

我得到返回四個目錄:

file1.txt 
file2.txt 
file3.txt 
file4.txt 

我的問題是,我怎麼能簡單地返回四個目錄叫:

file1 
file2 
file3 
file4 

我已閱讀http://www.linuxjournal.com/article/8919但一直未能實施這些正則表達式與GNU平行。我想我在這裏錯過了一些東西。此外,任何具有更復雜的正則表達式的例子都將非常感激。

+0

我沒有平行安裝,因此無法測試或閱讀文檔。 'mkdir文件並行{1..4}'是我的猜測。 – 2012-04-24 21:04:58

+0

感謝所有花時間寫信/回覆的人。這裏肯定有一些很好的答案,我相信這些對於學習'gnu parallel'的人都會非常有幫助。乾杯! – Steve 2012-04-25 08:55:08

回答

6

是的,看來你是失去了一些東西在這裏。文章解釋了shell參數擴展的功能。那些大括號(始終爲$)與parallel實用程序的默認替換字符串無關,後者一致地使用大括號。 parallel documentation顯示命令行選項允許使用任意字符串而不是其大括號括起來的默認值。

例如,替換字符串{.}在你的例子可以改成%foo

ls * | parallel --extensionreplace %foo "mkdir ./%foo" 

更多從linuxjournal文章${…}可以在man bash頁面可以發現,在參數擴展節。

既然你在@AdamLiss回答評論問,這裏是一個辦法(AB)使用大括號--colsep參數來執行你的任務:

ls * | parallel --colsep '\.' "mkdir ./{1}" 

注:此--colsep如果文件名包含兩個以上的時間段(因爲路徑名在第一個時間段被截斷,因此(與@AdamLiss提出的sed類似)將產生不希望的結果。

但是,由於--colsep參數是一個正則表達式,這應該是彈性的,以期在別處的文件名:

ls * | parallel --colsep '\.[^\.]*$' "mkdir ./{1.}" 

注:--extensionreplace不會由於工作並行的電流(21120422)版本的一個錯誤。但由於parallel是一個Perl腳本,你可以通過改變修復:

"extensionreplace|er" => \$::opt_U, 

"extensionreplace|er=s" => \$::opt_U, 
+0

+1絕對精彩。正是我在找什麼。你使用'--colsep'正則表達式非常有用。謝謝! – Steve 2012-04-25 08:45:13

+0

今天的答案是:'parallel - plus mkdir ./ {..}' – 2017-07-18 16:25:41

2

如果你不介意使用sed,這裏有一個解決方法:

ls * | sed 's/\..*//' | parallel "mkdir ./{}" 
+0

+1這是一個很好的使用'sed'和完美的解決方法。但是,有沒有更簡潔的方法? (ab)使用大括號有更好的方法嗎? – Steve 2012-04-22 23:35:47

1

我沒有得到什麼「超」是或者當你運行並行進入,或使用並行命令中的「{。}」。 AFAIK,平行作品像xargs,只懂{}。我錯過了什麼?

在任何情況下,我想達到的目標有一個循環:

for f in *; do mkdir "${f%%.*}"; done 

或者,如果你真的在乎並行的工作這麼短:

for f in *; do mkdir "${f%%.*}" & done 
+2

你錯過了'parallel'的文檔:http://www.gnu.org/software/parallel/man.html – 2012-04-22 23:45:49

+0

Hm。我的系統顯然有不同的版本;在本地手冊頁中沒有提到{。}。感謝您爲我做的Google搜索@AdamLiss。 – 2012-04-23 00:11:29

+0

+1很好的使用循環來製作並行。我得到了gnu parallel只能理解'{}'和'{。}'這個偷偷摸摸的猜測,任何人都可以證實這一點? – Steve 2012-04-23 00:39:18

1

按照example in the manual page,即使它不完全美麗,以下情況仍然有效:

ls *.txt.super| parallel --er {txt} 'echo {txt}|parallel "mkdir ./{.}"' 

Remov通過並行調用並行並在並行的父實例中將{.}字符串混淆到{txt}來完成第二個文件擴展。

+0

我看到你想在這裏做什麼,但我得到了返回:'/ bin/bash:{txt}:命令未找到' – Steve 2012-04-23 00:36:27

+0

它不適用於我(並行似乎並不認可' - er'選項並將'{txt}'解釋爲命令),但根據最新的手冊頁,這是它應該工作的方式。可能是一個並行的bug。 – 2012-04-23 08:13:32

+0

@DanielRoethlisberger你是對的。 '--er'不工作是由於'parallel'中的一個錯誤。查看我的答案以解決問題。 – 2012-04-25 04:22:55

1

這可能會爲你工作:

ls * | parallel echo {.} | parallel mkdir {.}