我有三个命令可以工作,我想创建一个可以执行所有文件的循环,而不必按名称单独为所有文件键入它们。我不明白为什么它不能作为一个循环工作。
我想要它做什么,就是这个词"索引"在左上角,然后 在那之后的每一行,从1到我的.gcount文件中的行数的数字; 然后将上面和右边的每个.gcount文件的内容粘贴到名为" index_foo.gcount"
的新文件中基于错误消息(目录不存在),问题似乎是错误使用花括号?
for files in ./*.gcount
do
echo "Index" > index
seq 1 1 $(cat $files | wc -l) >> index
paste -d "\t" index $files > index_${files}
done
答案 0 :(得分:2)
更新:问题是$files
将包含目录名称,当您尝试从中输出文件名时会导致问题。我原本以为它可能是一个文件名空间问题(仅用in *
测试过),但 gniourf_gniourf 发现了真正的问题:
这是因为
index_$files
会扩展为index_./stuff.gcount
,因为目录index_.
不存在,Bash会抱怨。解决此问题的两种可能性:1)使用for files in *.gcount
,这样您就不会在文件中包含任何斜杠。 2)仅在do
关键字files=${files#./}
之后保留文件的基本名称。这将摆脱领先的./
。
(编辑以便帖子包含真正的解决方案。应该转到 gniourf_gniourf ,但我们讨论了他在编辑时没有发布他的答案。)
这是原帖,可能仍然展示了一些不错的做法:
在这里工作,虽然有"索引"行也将编号。
检查您的任何文件名是否包含空格,因为这会破坏它。要使脚本正确处理此类文件名,您应引用$files
以确保它扩展为单个单词,例如
paste -d "\t" index "$files" > index_"${files}"
,和其他线类似。 (顺便说一下,{}
不需要nl(1)
,但他们不会受伤。)
如果您只想在文件中添加行号,则更容易使用{ echo Index; nl -nln -ba "$files"; } > index_"${files}"
(这似乎是POSIX,因此它应该是合理的便携式)。以下是您可以使用的与您之后的格式匹配的示例:
--
使用括号可以将许多命令的输出重定向到同一个地方。
值得注意的另一个(略微挑剔)的事情是,您可以使用-
许多命令关闭标记处理,这样您就可以处理以ls -- -weirdly_named_file
开头的文件名。以下是一个例子:seq 1 1 $(wc -l < "$files") > index
{ echo "Index"; paste -d "\t" index "$files"; } > index_"${files}"
。
您可以通过以下方式执行以下操作来修复原始版本中的编号错误:
{{1}}
This问题包含用于在文件开头添加行的其他变体。