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的文件,并且它无法正确处理名称中带有空格的文件。