Linux:管道输出到唯一文件

Linux:管道输出到唯一文件,linux,shell,command-line,command,Linux,Shell,Command Line,Command,我有一个包含数百个文本文件的文件夹,我想运行一个名为mint的Linux命令。此命令输出一个文本值,我希望将其存储在唯一的文件中,文件夹中的每个文件对应一个文本值。是否有一种方法可以使用*字符来运行命令,以表示我的所有输入文件,同时仍然将输出管道化到一个彼此唯一的文件 例如: $mint*>uniqueFile.krn修复错误并关闭警告: #!/bin/bash # ^^^^ - bash, not sh, for [[ ]] support for f in *.krn; do

我有一个包含数百个文本文件的文件夹,我想运行一个名为
mint
的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
  [[ $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
    仅当具有给定名称的文件存在且非空时才为真
  • test file1-nt file2
    仅当两个文件都存在且
    file1
    file2
    新时才为真
  • [[]]
    是一种ksh扩展shell语法,它源于
    测试
    命令的语法,增加了对模式匹配测试的支持(即
    [[$string=*.txt]]
    只有在
    $string
    扩展到以
    .txt
    结尾的值时才是真的),并放宽了引用规则(编写
    [-s$f]是安全的)
    ,但是
    test-s“$f”
    需要引号来处理所有可能的文件名)

    • 谢谢你的建议!Shiping的解决方案非常有效,我只是在文件名后面加了一个前缀。像这样:

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

      从问题中移除自我回答,并标记社区Wiki;请参见

      您可以尝试“for file in*;do mint$file>$file.krn;done”但是,如果您将例如
      file1
      file1.krn
      作为输入文件,您将得到不需要的覆盖。似乎您已经验证了没有
      .krn
      文件,但是为了安全起见,如果使用bash,您可以设置noclobber:
      set-C
      。复制一个副本,然后尝试
      并行'mint{}>{}.krn'::::*
      mint$file>int\u$file
      实际上有点错误,如果您的任何文件名包含空格。引号很重要:
      mint“$file”>“int_$file”
      BTW,答案不属于问题。如果要添加答案,请将其添加为答案。如果你认为你不能因此获得信用/代表(因为,在本例中,它来自一条评论),请将其标记为“CommunityWiki”。这有一些bug。例如,如果您多次运行它,它将创建名为
      int\u int\u foo
      files的文件,并且它无法正确处理名称中带有空格的文件。