【问题标题】:Learning bash: Append a line to list of files学习 bash:在文件列表中追加一行
【发布时间】:2012-04-03 07:23:24
【问题描述】:

我有一个文件列表,我想在文件末尾添加一行。我找不到正确的方法:

find . | grep filexxx | xargs << echo "attribute=0000"

不幸的是,这似乎不起作用。不写脚本,哪个oneliner命令能做到?

谢谢!

【问题讨论】:

    标签: linux bash shell unix sh


    【解决方案1】:

    你可以像这样使用 find 的选项:-exec:

    find . -type f -name "file*" -exec bash -c 'echo "your line" >> $1' -- {} \;
    

    您需要更改文件* 以匹配您正在寻找的文件。

    还有另一种可能:

    find . -type f | while read file; do echo "your line" >> $file ; done
    

    您可以通过管道查找到 grep 或在上面使用 -name

    编辑:

    根据 cmets 中 knittl 的建议,如果您的文件名包含换行符,则上述一行将出现问题.. 以及 Gordon 提供的解决方案:

    find . -type f -print0 | while IFS= read -r -d '' file; do ...
    

    【讨论】:

    • 请注意,如果您的文件名包含换行符,find|while 会导致问题。
    • @knittl:正确;为避免麻烦,请改用find . -type f -print0 | while IFS= read -r -d '' file; do ...
    【解决方案2】:

    或者使用一个简单的循环:

    for f in *txt; do echo "yada" >> "${f}"; done
    

    【讨论】:

    • 这不适用于子目录中的文件。此外,您不必双引号 ${f}
    • 我不知道这是一个要求,OP 只说“文件列表”,与深度无关。由于空间副作用,我通常在 Bash 中插入变量时引用。另一个评论中的while read 示例实际上更适合正确处理文件中的空格。
    • 我不知道这是否是一个要求,我只是澄清了:-) 如果 OP 希望它进入子目录。
    • @bos,你肯定会引用 $f,否则它会因带有空格的文件而中断。
    【解决方案3】:

    有很多方法可以做到这一点。 wisent 的答案是之一。这是另一个,也许更直观,即使它产生更多进程:

    for fname in $(find . | grep filexxx) ; do echo "attribute=0000" >> $fname ; done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      相关资源
      最近更新 更多