2017-02-03 69 views
0

我有一個文件夾存檔數百個文本文件,我想運行一個名爲mint的Linux命令。此命令輸出一個文本值,我想要將其存儲在唯一文件中,對於文件夾中的每個文件都有一個值。有沒有辦法使用*字符來運行該命令來表示所有的輸入文件,同時仍然將輸出管道輸送到獨立於每個其他文件的文件?Linux:管道輸出到唯一文件

例子: $ mint * > uniqueFile.krn

+3

您可以嘗試「for file in *; do mint $ file> $ file.krn; done」 – Shiping

+0

但是,如果您有例如'file1'和'file1.krn'作爲輸入文件,您將得到不需要的覆蓋。你似乎可能證實沒有'.krn'文件,但爲了安全起見,如果使用bash,你可以設置noclobber:'set -C'。 –

+0

複製並嘗試'parallel'mint {}> {} .krn'::: *' –

回答

0

隨着修復的錯誤和警告關閉:

#!/bin/bash 
#  ^^^^ - bash, not sh, for [[ ]] support 

for f in *.krn; do 
    [[ $f = *.krn ]] && continue # skip files already ending in .krn 
    mint "$f" >"$f.krn" 
done 

或者,用一個前綴:

​​

您也能避免重建已經存在的,除非哈希源文件已更改:

for f in *; do 

    # don't hash hash files 
    [[ $f = int_* ]] && continue 

    # if a non-empty hash file exists, and is newer than our source file, don't hash again 
    [[ -s "int_$f" && "int_$f" -nt "$f" ]] && continue 

    # ...if we got through the above conditions, then go ahead with creating a hash 
    mint "$f" >"int_$f" 
done 

爲了解釋:

  • test -s filename是真實的,只有如果給定名稱的文件存在且非空
  • test file1 -nt file2是真的只有存在這兩個文件,並file1較新,file2
  • [[ ]]不同於導出了test命令KSH-擴展shell語法,對於模式匹配測試添加支持(即僅當$string膨脹以在.txt結束的值[[ $string = *.txt ]]將爲真),和放鬆的引用規則(編寫[[ -s $f ]]是安全的,但test -s "$f"需要引號來處理所有可能的文件名)。
0

感謝您的所有建議! Shiping的解決方案效果很好,我只在文件名後加了一個前綴。像這樣:

$ for file in * ; do mint $file > int_$file ; done 

自答從問題和標記的社區Wiki中移出;請參閱What is the appropriate action when the answer to a question is added to the question itself?

+0

這有一些錯誤。例如,如果您多次運行它,它將創建名稱爲「int_int_foo」文件的文件,並且它不會正確處理其名稱中包含空格的文件。 –