如何从Bash中的文件列表中捕获多个文件?

时间:2012-07-23 19:52:54

标签: file bash loops

我有一个包含文件列表的文本文件。我想将cat他们的内容放在一起。做这个的最好方式是什么?我正在做这样的事情,但似乎过于复杂:

let count=0
while read -r LINE
do
    [[ "$line" =~ ^#.*$ ]] && continue
    if [ $count -ne 0 ] ; then
        file="$LINE"
        while read PLINE
        do
            echo $PLINE | cat - myfilejs > /tmp/out && mv /tmp/out myfile.js
        done < $file
    fi
    let count++
done < tmp

我正在跳过评论行并遇到问题。必须有更好的方法来做到这一点,没有两个循环。谢谢!

6 个答案:

答案 0 :(得分:11)

或者在简单的命令中

cat $(grep -v '^#' files) > output

答案 1 :(得分:5)

#!/bin/bash

files=()
while read; do
    case "$REPLY" in
        \#*|'') continue;;
        *) files+=( "$REPLY" );;
    esac
done < input
cat "${files[@]}"

这种方法更好的是:

  1. 唯一的外部命令cat仅执行一次。
  2. 为任何给定的行/文件名维护重要的空格非常小心。

答案 2 :(得分:3)

{
  while read file
  do
    #process comments here with continue
    cat "$file"
  done
} < tmp > newfile

答案 3 :(得分:1)

cat $(cat listoffiles) | grep -v "^#"怎么样?

答案 4 :(得分:1)

<强> xargs

printf 'a\nb\n' > files
printf '12\n3\n' > a
printf '4\n56\n' > b
xargs cat < files

输出:

12
3
4
56

相关:How to pipe list of files returned by find command to cat to view all the files

答案 5 :(得分:0)

我最终得到了这个:

sed '/^$/d;/^#/d;s/^/cat "/;s/$/";/' files | sh > output

步骤:

  1. sed 删除空行&amp;从文件中注释掉了行。

  2. sed 然后将cat "";中的每一行换行。

  3. 然后将脚本传送到 sh ,然后输入输出