Bash循环涉及将文件名附加到单词

时间:2015-03-10 22:48:35

标签: bash

我有三个命令可以工作,我想创建一个可以执行所有文件的循环,而不必按名称单独为所有文件键入它们。我不明白为什么它不能作为一个循环工作。

我想要它做什么,就是这个词"索引"在左上角,然后 在那之后的每一行,从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

1 个答案:

答案 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问题包含用于在文件开头添加行的其他变体。