Linux:将输出管道输出到唯一文件

时间:2017-02-03 22:38:34

标签: linux shell command-line command

我有一个包含数百个文本文件的文件夹,我想运行一个名为mint的Linux命令。此命令输出我想要存储在唯一文件中的文本值,每个文件对应一个文件夹。有没有办法使用*字符来运行命令来表示我的所有输入文件,同时仍然将输出汇总到一个独立于其他文件的文件中?

实施例: $ mint * > uniqueFile.krn

2 个答案:

答案 0 :(得分: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
  [[ $f = int_* ]] && continue
  mint "$f" >"int_$f"
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才为真 仅当两个文件都存在且<{1}}比test file1 -nt file2更新时,
  • file1才为真。
  • file2是从[[ ]]命令派生的ksh扩展shell语法,添加了对模式匹配测试的支持(即。test仅在{{1}时才为真扩展到以[[ $string = *.txt ]]结尾的值,并放宽引用规则(编写$string是安全的,但.txt需要引号才能使用所有可能的文件名。)

答案 1 :(得分: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?