我有一個文件夾存檔數百個文本文件,我想運行一個名爲mint
的Linux命令。此命令輸出一個文本值,我想要將其存儲在唯一文件中,對於文件夾中的每個文件都有一個值。有沒有辦法使用*
字符來運行該命令來表示所有的輸入文件,同時仍然將輸出管道輸送到獨立於每個其他文件的文件?Linux:管道輸出到唯一文件
例子: $ mint * > uniqueFile.krn
我有一個文件夾存檔數百個文本文件,我想運行一個名爲mint
的Linux命令。此命令輸出一個文本值,我想要將其存儲在唯一文件中,對於文件夾中的每個文件都有一個值。有沒有辦法使用*
字符來運行該命令來表示所有的輸入文件,同時仍然將輸出管道輸送到獨立於每個其他文件的文件?Linux:管道輸出到唯一文件
例子: $ mint * > uniqueFile.krn
隨着修復的錯誤和警告關閉:
#!/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"
需要引號來處理所有可能的文件名)。感謝您的所有建議! 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?
這有一些錯誤。例如,如果您多次運行它,它將創建名稱爲「int_int_foo」文件的文件,並且它不會正確處理其名稱中包含空格的文件。 –
您可以嘗試「for file in *; do mint $ file> $ file.krn; done」 – Shiping
但是,如果您有例如'file1'和'file1.krn'作爲輸入文件,您將得到不需要的覆蓋。你似乎可能證實沒有'.krn'文件,但爲了安全起見,如果使用bash,你可以設置noclobber:'set -C'。 –
複製並嘗試'parallel'mint {}> {} .krn'::: *' –