2014-09-28 313 views
2

我想要刪除目錄中每個文件的第一行,並通過在每個文件名末尾附加'.tmp'來保存相應的輸出。例如,如果有一個名爲input.txt文件,內容如下:將xargs的輸出重定向到文件

line 1 
line 2 

我想創建在同一目錄與名稱input.txt.tmp一個文件,該文件將具有以下內容

line 2 

我嘗試下面的命令:

find . -type f | xargs -I '{}' tail -n +2 '{}' > '{}'.tmp 

的問題是,不是寫輸出到單獨的文件與.tmp後綴,它會創建只有一個罪惡gle文件名爲{}.tmp。我知道這是因爲輸出重定向完成後xargs完成。但是有什麼辦法可以告訴xargs輸出重定向是它的參數的一部分嗎?

回答

3

注意您可以同時使用find-exec,而不需要管xargs

find . -type f -exec sh -c 'f={}; tail -n+2 $f > $f.tmp' \; 
          ^^^^ ^^^^^^^^^^^^^^^^^^^^^ 
           | perform the tail and redirection 
        store the name of the file 
+1

感謝這個解決我的問題:) – 2014-09-28 10:35:15

+1

從'find'是危險的,如果文件名是由邪惡的人做跑步「SH -c」 。試試:'touch'foo;回聲頑皮淘氣 - 我可以在運行上述之前刪除文件。 – 2014-10-01 20:38:31

2

如果你已經GNU並行你可以運行:

find . -type f | parallel tail -n +2 {} '>' {}.tmp 

所有新計算機具有多個核心,但大多數程序本質上是串行的,因此不會使用多核。然而,許多任務十分parallelizeable:

  • 上有許多文件運行同一程序
  • 運行在一個文件
  • 運行在一個文件中的每個塊的同一個程序的每一行同一程序

GNU並行是一個通用的並行程序,可以很容易地在同一臺機器或多臺你有ssh訪問的機器上並行運行作業。

如果你想在4個CPU上運行32個不同的工作崗位,並行化直接的方式是在每個CPU上運行8個作業:

Simple scheduling

GNU並行,而不是產生一個新的進程時,一個完成 - 保持CPU的活躍,從而節省了時間:

GNU Parallel scheduling

安裝

個人安裝不需要root訪問權限。它可以在10秒內通過這樣來完成:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

對於其他安裝選項見http://git.savannah.gnu.org/cgit/parallel.git/tree/README

瞭解更多

查看更多的例子:http://www.gnu.org/software/parallel/man.html

觀看介紹視頻: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

走過t他教程:http://www.gnu.org/software/parallel/parallel_tutorial.html

訂閱郵件列表,以獲得支持:https://lists.gnu.org/mailman/listinfo/parallel

+0

不要忘記每次運行'parallel --bibtex'並在提示符處輸入'will cite'來使引用聲明無效,而不必每次都運行命令'parallel --citation'。 #嘆 – 2016-10-18 15:44:14